矩阵每行包含特定编号

时间:2018-12-09 00:26:40

标签: python numpy

我想知道矩阵的每一行中是否至少有一个零

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

i == rows

这是对的还是有更好的方法?

1 个答案:

答案 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)要快一些。