重複した配列を削除したいのですが、配列全体に重複はありません。また、私は注文を変更しないでください。入力は出力が[0 1 3 2 3]
以下の重複した配列をnumpy配列で削除してください
あるべき[0 0 1 3 2 2 3 3]
ある場合
は、だから私はitertools.groupby()
を使用して方法を見つけたが、私はより速くnumpy
解決策を探しています。 numpyの配列を使用して、純粋なPythonのウィッヒについては
重複した配列を削除したいのですが、配列全体に重複はありません。また、私は注文を変更しないでください。入力は出力が[0 1 3 2 3]
以下の重複した配列をnumpy配列で削除してください
あるべき[0 0 1 3 2 2 3 3]
ある場合
は、だから私はitertools.groupby()
を使用して方法を見つけたが、私はより速くnumpy
解決策を探しています。 numpyの配列を使用して、純粋なPythonのウィッヒについては
a[np.insert(np.diff(a).astype(np.bool),0,True)]
Out[99]: array([0, 1, 3, 2, 3])
一般的な考え方は、diff
を使用して、配列内の2つの連続した要素の違いを見つけることです。次に、non-zero
個の要素だけを索引付けします。しかし、diff
の長さは1だけ短くなるため、インデックス作成の前に、insert
をdiff配列の先頭に設定する必要があります。
説明:
In [100]: a
Out[100]: array([0, 0, 1, 3, 2, 2, 3, 3])
In [101]: diff = np.diff(a).astype(np.bool)
In [102]: diff
Out[102]: array([False, True, True, True, False, True, False], dtype=bool)
In [103]: idx = np.insert(diff, 0, True)
In [104]: idx
Out[104]: array([ True, False, True, True, True, False, True, False], dtype=bool)
In [105]: a[idx]
Out[105]: array([0, 1, 3, 2, 3])
も動作します。この:
def modify(l):
last = None
for e in l:
if e != last:
yield e
last = e
pure = modify([0, 0, 1, 3, 2, 2, 3, 3])
import numpy
num = numpy.array(modify(numpy.array([0, 0, 1, 3, 2, 2, 3, 3])))
任意のnumpyの機能がこれをスピードアップするでしょうWICHがある場合、私は知りません。