我想知道矩阵的每一行中是否至少有一个零
i = 0
for row in range(rows):
if A[row].contains(0):
i += 1
i == rows
这是对的还是有更好的方法?
答案 0 :(得分:3)
您可以通过单个矢量化操作来重现整个代码块的效果:
np.all((rows == 0).sum(axis=1))
或者(基于评论中Mateen Ulhaq的建议),您可以执行以下操作:
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
)要快一些。