Ми ініціалізуємо масив numpy нулями, як показано нижче:
np.zeros((N,N+1))
Але як ми перевіримо, чи всі елементи в заданій n * n матриці numpy масиву дорівнюють нулю.
Метод просто повинен повернути True, якщо всі значення дійсно дорівнюють нулю.
Відповіді:
Перевірте numpy.count_nonzero .
>>> np.count_nonzero(np.eye(4))
4
>>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]])
5
Інші відповіді, розміщені тут, будуть працювати, але найбільш чіткою та ефективною функцією для використання є numpy.any():
>>> all_zeros = not np.any(a)
або
>>> all_zeros = not a.any()
numpy.all(a==0)оскільки вона використовує менше оперативної пам'яті. (Для цього не потрібен тимчасовий масив, створений a==0терміном.)numpy.count_nonzero(a)тому, що він може повернутися негайно, коли буде знайдено перший ненульовий елемент.np.any()більше не використовує логіку "короткого замикання", тому ви не побачите переваги швидкості для малих масивів.anyі allробити НЕ коротке замикання. Я вважаю, що вони є цукром для logical_or.reduceі logical_and.reduce. Порівняйте одне з одним і моє коротке замикання is_in: all_false = np.zeros(10**8) all_true = np.ones(10**8) %timeit np.any(all_false) 91.5 ms ± 1.82 ms per loop %timeit np.any(all_true) 93.7 ms ± 6.16 ms per loop %timeit is_in(1, all_true) 293 ns ± 1.65 ns per loop
Я б використовував np.all тут, якщо у вас є масив a:
>>> np.all(a==0)
np.all(a==a[0]). Дуже дякую!
Як говорить інша відповідь, ви можете скористатися оцінками неправдивості / хибності, якщо знаєте, що 0це єдиний фальшивий елемент, можливо, у вашому масиві. Усі елементи масиву хибні, якщо в ньому немає жодних елементів. *
>>> a = np.zeros(10)
>>> not np.any(a)
True
Однак відповідь стверджувала, що anyце швидше, ніж інші варіанти, частково через коротке замикання. Станом на 2018 рік, Numpy allі any не замикають .
Якщо ви часто робите подібні речі, дуже легко зробити власні версії з коротким замиканням, використовуючи numba:
import numba as nb
# short-circuiting replacement for np.any()
@nb.jit(nopython=True)
def sc_any(array):
for x in array.flat:
if x:
return True
return False
# short-circuiting replacement for np.all()
@nb.jit(nopython=True)
def sc_all(array):
for x in array.flat:
if not x:
return False
return True
Вони, як правило, швидші за версії Numpy, навіть коли вони не замикаються. count_nonzeroє найповільнішим.
Деякі дані для перевірки ефективності:
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)
# mid_0 = [1 1 1 ... 1 0 1 ... 1 1 1]
# mid_1 = [0 0 0 ... 0 1 0 ... 0 0 0]
Перевірка:
## count_nonzero
%timeit np.count_nonzero(all_0)
# 220 ms ± 8.73 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit np.count_nonzero(all_1)
# 150 ms ± 4.56 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
### all
# np.all
%timeit np.all(all_1)
%timeit np.all(mid_0)
%timeit np.all(all_0)
# 56.8 ms ± 3.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 57.4 ms ± 1.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 55.9 ms ± 2.13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# sc_all
%timeit sc_all(all_1)
%timeit sc_all(mid_0)
%timeit sc_all(all_0)
# 44.4 ms ± 2.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 22.7 ms ± 599 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 288 ns ± 6.36 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
### any
# np.any
%timeit np.any(all_0)
%timeit np.any(mid_1)
%timeit np.any(all_1)
# 60.7 ms ± 1.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 60 ms ± 287 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 57.7 ms ± 1.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# sc_any
%timeit sc_any(all_0)
%timeit sc_any(mid_1)
%timeit sc_any(all_1)
# 41.7 ms ± 1.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 22.4 ms ± 1.51 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 287 ns ± 12.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
* Корисно allта anyеквівалентно:
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))
Якщо ви тестуєте на всі нулі, щоб уникнути попередження про іншу функцію numpy, тоді загортання рядка у спробу, окрім блокування, заощадить необхідність робити тест на нулі перед операцією, яка вас цікавить, тобто
try: # removes output noise for empty slice
mean = np.mean(array)
except:
mean = 0
not np.count_nonzero(np.eye(4))повернути,Trueлише якщо всі значення дорівнюють 0.