2014-10-02 37 views
4

在numpy中,如果所有行在二維數組中都不同,是否有一種很好的慣用測試方法?如何測試所有行在numpy中是否不同

我想我可以做

len(np.unique(arr)) == len(arr) 

但是這並不在所有的工作。例如,

arr = np.array([[1,2,3],[1,2,4]]) 
np.unique(arr) 
Out[4]: array([1, 2, 3, 4]) 
+0

注:http://stackoverflow.com/questions/16970982/find-unique- row-in-numpy-array是關於查找唯一行的,OP是關於TESTING行是否都是唯一的。不同的問題。 – 2014-10-02 17:10:18

+0

有關如何刪除非唯一行/列的幾個有趣答案:http://mail.scipy.org/pipermail/scipy-user/2011-December/031193.html。然後您可以看到縮小的數組是否與原始數組相同。如果你使用熊貓,有一個有效的實施來做這樣的事情。 – wflynny 2014-10-02 17:15:30

+0

@GWW朱主任指出這不是問題的不同嗎? – eleanora 2014-10-02 17:53:00

回答

0

就可以計算出相關矩陣,並詢問是否對角線元素被1:如果你想要做類似的事情列

(np.corrcoef(M)==1).sum()==M.shape[0] 


In [66]: 

M = np.random.random((5,8)) 
In [72]: 

(np.corrcoef(M)==1).sum()==M.shape[0] 
Out[72]: 
True 

此:

(np.corrcoef(M, rowvar=0)==1).sum()==M.shape[1]

或根本沒有numpy

len(set(map(tuple,M)))==len(M) 

Fiter出唯一的行,然後進行測試,如果得到的是相同M是矯枉過正:

In [99]: 

%%timeit 

b = np.ascontiguousarray(M).view(np.dtype((np.void, M.dtype.itemsize * M.shape[1]))) 
_, idx = np.unique(b, return_index=True) 

unique_M = M[idx] 

unique_M.shape==M.shape 
10000 loops, best of 3: 54.6 µs per loop 
In [100]: 

%timeit len(set(map(tuple,M)))==len(M) 
10000 loops, best of 3: 24.9 µs per loop 
+0

非常感謝你。令人驚訝的是,非numpy的方式是最快的。它不需要轉換numpy數組 - >元組 - > set? – eleanora 2014-10-03 08:07:18

相關問題