Матрица содержит конкретное число в строке - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу знать, есть ли хотя бы один ноль в каждой строке матрицы

i = 0
for row in range(rows):
    if A[row].contains(0):
        i += 1

i == rows

это правильно или есть лучший способ?

1 Ответ

0 голосов
/ 09 декабря 2018

Вы можете воспроизвести эффект всего блока кода в одной векторизованной операции:

np.all((rows == 0).sum(axis=1))

В качестве альтернативы (основываясь на предложении Матина Улхака в комментариях), вы можете сделать:

np.all(np.any(rows == 0, axis=1))

Тестирование

a = np.arange(5*5).reshape(5,5)
b = a.copy()
b[:, 3] = 0

print('a\n%s\n' % a)
print('b\n%s\n' % b)

print('method 1')
print(np.all((a == 0).sum(axis=1)))
print(np.all((b == 0).sum(axis=1)))
print()

print('method 2')
print(np.all(np.any(a == 0, axis=1)))
print(np.all(np.any(b == 0, axis=1)))

Вывод:

a
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

b
[[ 0  1  2  0  4]
 [ 5  6  7  0  9]
 [10 11 12  0 14]
 [15 16 17  0 19]
 [20 21 22  0 24]]

method 1
False
True

method 2
False
True

Время

%%timeit
np.all((a == 0).sum(axis=1))
8.73 µs ± 56.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
np.all(np.any(a == 0, axis=1))
7.87 µs ± 54 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Таким образом, второй метод (который использует np.any) немногобыстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...