2016-06-15 7 views
1

重複した配列を削除したいのですが、配列全体に重複はありません。また、私は注文を変更しないでください。入力は出力が[0 1 3 2 3]以下の重複した配列をnumpy配列で削除してください

あるべき[0 0 1 3 2 2 3 3]ある場合

は、だから私はitertools.groupby()を使用して方法を見つけたが、私はより速くnumpy解決策を探しています。 numpyの配列を使用して、純粋なPythonのウィッヒについては

答えて

3
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]) 
0

も動作します。この:

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がある場合、私は知りません。

関連する問題