Başka bir yanıtın da söylediği gibi, 0
dizinizdeki muhtemelen tek yanlış öğenin bu öğe olduğunu biliyorsanız, doğru / yanlış değerlendirmelerden yararlanabilirsiniz . Bir dizideki tüm öğeler yanlıştır, ancak içinde doğru öğeler yoksa. *
>>> a = np.zeros(10)
>>> not np.any(a)
True
Ancak cevap any
, kısmen kısa devre nedeniyle diğer seçeneklerden daha hızlı olduğunu iddia etti . 2018 itibariyle, Numpy's all
ve any
kısa devre yapmıyor .
Bu tür şeyleri sık sık yaparsanız, aşağıdakileri kullanarak kendi kısa devre sürümlerinizi oluşturmak çok kolaydır 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
Bunlar, kısa devre olmasa bile Numpy'nin sürümlerinden daha hızlı olma eğilimindedir. count_nonzero
en yavaş olanıdır.
Performansı kontrol etmek için bazı girdiler:
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)
Kontrol:
%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)
* Yararlı all
ve any
eşdeğerler:
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))
geri dönmek istersiniz .True