Seperti jawaban lain mengatakan, Anda dapat memanfaatkan evaluasi benar / salah jika Anda tahu bahwa itu 0
adalah satu-satunya elemen yang mungkin salah dalam array Anda. Semua elemen dalam array salah jika tidak ada elemen yang benar di dalamnya. *
>>> a = np.zeros(10)
>>> not np.any(a)
True
Namun, jawabannya mengklaim bahwa any
lebih cepat daripada opsi lain sebagian karena korsleting. Pada 2018, Numpy all
dan any
tidak mengalami hubungan arus pendek .
Jika Anda sering melakukan hal semacam ini, sangat mudah untuk membuat versi hubung singkat Anda sendiri menggunakan numba
:
import numba as nb
@nb.jit(nopython=True)
def sc_any(array):
for x in array.flat:
if x:
return True
return False
@nb.jit(nopython=True)
def sc_all(array):
for x in array.flat:
if not x:
return False
return True
Ini cenderung lebih cepat daripada versi Numpy bahkan saat tidak terjadi hubungan arus pendek. count_nonzero
adalah yang paling lambat.
Beberapa masukan untuk memeriksa kinerja:
import numpy as np
n = 10**8
middle = n//2
all_0 = np.zeros(n, dtype=int)
all_1 = np.ones(n, dtype=int)
mid_0 = np.ones(n, dtype=int)
mid_1 = np.zeros(n, dtype=int)
np.put(mid_0, middle, 0)
np.put(mid_1, middle, 1)
Memeriksa:
%timeit np.count_nonzero(all_0)
%timeit np.count_nonzero(all_1)
%timeit np.all(all_1)
%timeit np.all(mid_0)
%timeit np.all(all_0)
%timeit sc_all(all_1)
%timeit sc_all(mid_0)
%timeit sc_all(all_0)
%timeit np.any(all_0)
%timeit np.any(mid_1)
%timeit np.any(all_1)
%timeit sc_any(all_0)
%timeit sc_any(mid_1)
%timeit sc_any(all_1)
* Bermanfaat all
dan any
kesetaraan:
np.all(a) == np.logical_not(np.any(np.logical_not(a)))
np.any(a) == np.logical_not(np.all(np.logical_not(a)))
not np.all(a) == np.any(np.logical_not(a))
not np.any(a) == np.all(np.logical_not(a))
not np.count_nonzero(np.eye(4))
mengembalikanTrue
jika semua nilainya 0.