6

次のようなデータセットがあります。

[[0,1],
 [0,2],
 [0,3],
 [0,4],
 [1,5],
 [1,6],
 [1,7],
 [2,8],
 [2,9]]

最初の列で定義されているように、データの各サブビューの最初の要素を削除する必要があります。最初に、最初の列が 0 であるすべての要素を取得し、最初の行 [0,1] を削除します。次に、最初の列に 1 を含む要素を取得し、最初の行 [1,5] を削除します。次のステップでは [2,8] を削除します。最後に、次のようなデータセットが必要です。

[[0,2],
 [0,3],
 [0,4],
 [1,6],
 [1,7],
 [2,9]]

編集: これは numpy で実行できますか? 私のデータセットは非常に大きいため、すべての要素の for ループが完了するまでに少なくとも 4 分かかります。

4

5 に答える 5

4

要求に応じて、numpy解決策:

import numpy as np
a = np.array([[0,1], [0,2], [0,3], [0,4], [1,5], [1,6], [1,7], [2,8], [2,9]])
_,i = np.unique(a[:,0], return_index=True)

b = np.delete(a, i, axis=0)

(上記は@Jaimeのソリューションを組み込むために編集されています。これは後世のために私のオリジナルのマスキングソリューションです)

m = np.ones(len(a), dtype=bool)
m[i] = False
b = a[m]

興味深いことに、マスクの方が高速なようです。

In [225]: def rem_del(a):
   .....:     _,i = np.unique(a[:,0], return_index=True)
   .....:     return np.delete(a, i, axis = 0)
   .....: 

In [226]: def rem_mask(a):
   .....:     _,i = np.unique(a[:,0], return_index=True)
   .....:     m = np.ones(len(a), dtype=bool)
   .....:     m[i] = False
   .....:     return a[m]
   .....: 

In [227]: timeit rem_del(a)
10000 loops, best of 3: 181 us per loop

In [228]: timeit rem_mask(a)
10000 loops, best of 3: 59 us per loop
于 2013-03-29T15:22:17.643 に答える
2

リストと、値を確認するキーを渡します。

def getsubset(set, index):
    hash = {}
    for list in set:
        if not list[index] in hash:
            set.remove(list)
            hash[list[index]]  = list

    return set
于 2013-03-29T15:09:38.550 に答える
1

anditertools.groupby()のダッシュで使用したい:itertools.islice()itertools.chain

from itertools import islice, chain, groupby
from operator import itemgetter

list(chain.from_iterable(islice(group, 1, None)
                         for key, group in groupby(inputlist, key=itemgetter(0))))
  • このgroupby()呼び出しは、入力リストを最初の項目が同じチャンクにグループ化します (itemgetter(0)はグループ化キーです)。
  • このislice(group, 1, None)呼び出しは、グループを iterables に変換し、最初の要素がスキップされます。
  • chain.from_iterable()呼び出しは各結果islice()を取得し、それらを新しい iterable に連結してlist()、リストに戻します。

デモ:

>>> list(chain.from_iterable(islice(group, 1, None) for key, group in groupby(inputlist, key=itemgetter(0))))
[[0, 2], [0, 3], [0, 4], [1, 6], [1, 7], [2, 9]]
于 2013-03-29T14:54:10.740 に答える
0

私の答えは:

from operator import itemgetter
sorted(l, key=itemgetter(1))  # fist sort by fist element of inner list 
nl = []
[[0, 1], [0, 2], [0, 3], [0, 4], [1, 5], [1, 6], [1, 7], [2, 8], [2, 9]]
j = 0;
for i in range(len(l)): 
    if(j == l[i][0]):
        j = j + 1   # skip element 
    else:
        nl.append(l[i])  # otherwise append  in new list

出力は次のとおりです。

>>> nl
[[0, 2], [0, 3], [0, 4], [1, 6], [1, 7], [2, 9]]
于 2013-03-29T15:01:02.533 に答える
0
a = [[0,1],
 [0,2],
 [0,3],
 [0,4],
 [1,5],
 [1,6],
 [1,7],
 [2,8],
 [2,9]]

a = [y for x in itertools.groupby(a, lambda x: x[0]) for y in list(x[1])[1:]]

print a
于 2013-03-29T14:54:32.813 に答える