Jak mówi inna odpowiedź, możesz skorzystać z prawdziwych / fałszywych ocen, jeśli wiesz, że 0
jest to jedyny fałszywy element w tablicy. Wszystkie elementy w tablicy są fałszywe, jeśli nie ma w niej żadnych prawdziwych elementów. *
>>> a = np.zeros(10)
>>> not np.any(a)
True
Jednak odpowiedź twierdziła, że any
jest szybszy niż inne opcje, częściowo z powodu zwarcia. Od 2018 roku Numpy all
i any
nie powodują zwarcia .
Jeśli często robisz takie rzeczy, bardzo łatwo jest stworzyć własne wersje powodujące zwarcie za pomocą 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
Wydaje się, że są szybsze niż wersje Numpy, nawet jeśli nie powodują zwarcia. count_nonzero
jest najwolniejszy.
Niektóre dane wejściowe do sprawdzenia wydajności:
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)
Czek:
%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)
* Pomocne all
i any
równoważne:
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))
zwrócićTrue
tylko wtedy, gdy wszystkie wartości są