Wystarczy sprawdzić, czy liczba, jeśli unikatowe elementy w tablicy są 1:
>>> arr = np.array([[1]*10 for _ in xrange(5)])
>>> len(np.unique(arr)) == 1
True
Rozwiązanie wzorowane unutbu na answer:
>>> arr = np.array([[1]*10 for _ in xrange(5)])
>>> np.all(np.all(arr == arr[0,:], axis = 1))
True
Jeden problem z kodem polega na tym, że najpierw tworzysz całą listę, zanim nałożysz na nią np.all()
. Dzięki temu nie ma zwarcie dzieje się w Twojej wersji, zamiast, że byłoby lepiej, gdyby użyć Pythona all()
z wyrażeniem generatora:
rozrządu porównań:
>>> 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
Jak już powiedziałem na [podobne pytanie] (http://stackoverflow.com/q/14859458/2988730), to naprawdę potrzebuje właściwego rozwiązania, które nie tworzy tymczasowej tablicy tak dużej, jak oryginał (który zarówno odpowiedzi tutaj tak samo jak i tam). Opublikuję odpowiedź po dodaniu numpy. –