2014-10-02 19 views
10

numpy'de nasıl test edilir Tüm satırlar 2d dizisinde eşit olup olmadığını test etmek için güzel bir deyimsel test yolu var mı?Tüm satırların eşit olduğu bir sayı

Ben Bu çirkin ve muhtemelen de yavaş olduğu numpy dizilerle piton listeleri karıştırmak gibi görünüyor

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

gibi bir şey yapabilirsiniz.

Daha güzel/daha iyi bir yol var mı? numara dizide benzersiz ürün 1 ise eğer

+1

[Benzer soru] için söylediğim gibi (http://stackoverflow.com/q/14859458/2988730), bu, orijinal kadar büyük bir geçici dizi oluşturmayan uygun bir çözüme ihtiyaç duyar (her ikisi de Burada olduğu gibi cevaplar da var). Numpy'ye ekledikten sonra bir cevap göndereceğim. –

cevap

11

bir yolu olduğunu nedeniyle bir jeneratör ifade ile Python en all() kullanırsanız daha iyi olacağını bunun yerine Sürümünüze oluyor hiçbir kısa devre var olduğunu için senin dizinin tüm satırları gelen ilk satırı çıkarmak ve her girişin eşit 0 olduğunu kontrol edin:

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

Bu daha hızlı daha büyük diziler için benzersiz satırları tanımlamak daha olabilir becaus e gerekli olan çok sayıda karşılaştırmayı engeller. aynı temel fikri kullanarak

bir biraz daha hızlı bir yöntemdir:

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

yani arr her satır arr ilk satırında eşit olduğunun doğrulanması.

+0

Bence bu en hızlı yoldur. Teşekkür ederim. – eleanora

+2

Eşitliğin kontrol edilmesi, farkın eşitliğine eşit olmak yerine, biraz daha hızlı olabilir. – Jaime

+0

Ne hakkında (np.diff (b, 1, 1) == 0) .all() ' – farenorth

5

Basitçe kontrol edin:

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

unutbu en answer esinlenerek bir çözüm: En koduyla

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

Bir problem np.all()'u uygulamadan önce tüm listeyi oluşturuyorsunuz.

Zamanlama karşılaştırmalar:

>>> 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

Sanırım ajcr'ın cevabı daha hızlı! – eleanora

+2

@ user2179021 Sistemimde 650 µs'yi alıyor, bu yüzden hala ikinci cevabımdan daha yavaş. –

+0

Anlaştık - ikinci yöntem benim sistemimde de benimkilerden daha hızlıdır. –

İlgili konular