2014-10-02 28 views
10

在numpy的平等,有測試的一個很好的習慣方式,如果所有行的二維數組一樣的嗎?如何測試是否所有行的numpy的

我可以這樣做

np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))]) 

這似乎與numpy的陣列混合蟒蛇名單這是醜陋的,想必也慢。

有沒有更好的/整潔的方式?

+1

正如我要[類似的問題]所述(http://stackoverflow.com/q/14859458/2988730),這確實需要不創建臨時數組一樣大的原始(兩者的適當溶液這裏的答案以及那裏的答案)。一旦我添加了numpy,我會發佈一個答案。 – 2016-04-07 21:01:21

回答

11

一種方法是從所有的陣列的行的減去第一行,並檢查每個條目是等於0:

>>> a = np.arange(9).reshape(3, 3) 
>>> b = np.ones((3, 3)) 
>>> ((a - a[0]) == 0).all() 
False 
>>> ((b - b[0]) == 0).all() 
True 

這可能比識別較大的陣列唯一行更快因爲...它避免了大量的比較需要。

A,使用相同的基本思想稍快的方法是:

(arr == arr[0]).all() 

即檢查的arr每行等於arr第一行。

+0

我認爲這是最快的方法。謝謝。 – eleanora 2014-10-02 15:32:18

+2

檢查的平等,而不是平等的差異0,很可能是一個稍快一點。 – Jaime 2014-10-02 16:58:45

+0

什麼'(np.diff(B,1,1)== 0)。所有()' – farenorth 2014-10-02 17:14:31

5

簡單的檢查次數,如果陣列中的唯一項目是1:

>>> arr = np.array([[1]*10 for _ in xrange(5)]) 
>>> len(np.unique(arr)) == 1 
True 

從unutbu的answer啓發:A液

>>> arr = np.array([[1]*10 for _ in xrange(5)]) 
>>> np.all(np.all(arr == arr[0,:], axis = 1)) 
True 

一個問題與您的代碼是在你申請np.all()之前先創建一個完整列表。由於,有沒有短路,在您的版本發生的事情,而不是,這將是更好,如果你使用Python的all()與發電機的表達:

時機比較:

>>> M = arr = np.array([[3]*100] + [[2]*100 for _ in xrange(1000)]) 
>>> %timeit np.all(np.all(arr == arr[0,:], axis = 1)) 
1000 loops, best of 3: 272 µs per loop 
>>> %timeit (np.diff(M, axis=0) == 0).all() 
1000 loops, best of 3: 596 µs per loop 
>>> %timeit np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))]) 
100 loops, best of 3: 10.6 ms per loop 
>>> %timeit all(np.array_equal(M[0], M[i]) for i in xrange(1,len(M))) 
100000 loops, best of 3: 11.3 µs per loop 

>>> M = arr = np.array([[2]*100 for _ in xrange(1000)]) 
>>> %timeit np.all(np.all(arr == arr[0,:], axis = 1)) 
1000 loops, best of 3: 330 µs per loop 
>>> %timeit (np.diff(M, axis=0) == 0).all() 
1000 loops, best of 3: 594 µs per loop 
>>> %timeit np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))]) 
100 loops, best of 3: 9.51 ms per loop 
>>> %timeit all(np.array_equal(M[0], M[i]) for i in xrange(1,len(M))) 
100 loops, best of 3: 9.44 ms per loop 
+0

我認爲ajcr的答案更快! – eleanora 2014-10-02 15:41:27

+2

@ user2179021它正在採取'650μs'我的系統上,所以比我的第二個答案還是慢。 – 2014-10-02 15:43:38

+0

同意 - 第二種方法在我的系統上也比我的速度快。 – 2014-10-02 15:46:26

相關問題