在numpy的平等,有測試的一個很好的習慣方式,如果所有行的二維數組一樣的嗎?如何測試是否所有行的numpy的
我可以這樣做
np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))])
這似乎與numpy的陣列混合蟒蛇名單這是醜陋的,想必也慢。
有沒有更好的/整潔的方式?
在numpy的平等,有測試的一個很好的習慣方式,如果所有行的二維數組一樣的嗎?如何測試是否所有行的numpy的
我可以這樣做
np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))])
這似乎與numpy的陣列混合蟒蛇名單這是醜陋的,想必也慢。
有沒有更好的/整潔的方式?
一種方法是從所有的陣列的行的減去第一行,並檢查每個條目是等於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
第一行。
簡單的檢查次數,如果陣列中的唯一項目是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
我認爲ajcr的答案更快! – eleanora 2014-10-02 15:41:27
@ user2179021它正在採取'650μs'我的系統上,所以比我的第二個答案還是慢。 – 2014-10-02 15:43:38
同意 - 第二種方法在我的系統上也比我的速度快。 – 2014-10-02 15:46:26
正如我要[類似的問題]所述(http://stackoverflow.com/q/14859458/2988730),這確實需要不創建臨時數組一樣大的原始(兩者的適當溶液這裏的答案以及那裏的答案)。一旦我添加了numpy,我會發佈一個答案。 – 2016-04-07 21:01:21