使用numpy查找矩阵中哪些行的所有元素都为零

新手上路,请多包涵

我有一个大的 numpy 矩阵 M 。矩阵的某些行的所有元素都为零,我需要获取这些行的索引。我正在考虑的天真的方法是遍历矩阵中的每一行,然后检查每个元素。

使用 numpy 完成此操作的更好更快的方法是什么?

原文由 Jack Twain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

这是一种方法。我假设已使用 import numpy as np 导入了 numpy。

 In [20]: a
Out[20]:
array([[0, 1, 0],
       [1, 0, 1],
       [0, 0, 0],
       [1, 1, 0],
       [0, 0, 0]])

In [21]: np.where(~a.any(axis=1))[0]
Out[21]: array([2, 4])

这个答案略有不同: How to check that a matrix contains a zero column?

这是怎么回事:

any 方法返回 True 如果数组中的任何值是“truthy”。非零数字被认为是 True,0 被认为是 False。通过使用参数 axis=1 ,该方法应用于每一行。对于示例 a ,我们有:

 In [32]: a.any(axis=1)
Out[32]: array([ True,  True, False,  True, False], dtype=bool)

所以每个值表示相应的行是否包含非零值。 ~ 运算符是二进制“非”或补码:

 In [33]: ~a.any(axis=1)
Out[33]: array([False, False,  True, False,  True], dtype=bool)

(给出相同结果的另一个表达式是 (a == 0).all(axis=1) 。)

要获取行索引,我们使用 where 函数。它返回其参数为 True 的索引:

 In [34]: np.where(~a.any(axis=1))
Out[34]: (array([2, 4]),)

请注意 where 返回了一个包含单个数组的元组。 where 适用于 n 维数组,因此它总是返回一个元组。我们想要那个元组中的单个数组。

 In [35]: np.where(~a.any(axis=1))[0]
Out[35]: array([2, 4])

原文由 Warren Weckesser 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果元素是 int(0) ,则接受的答案有效。如果要查找所有值为 0.0(浮点数)的行,则必须使用 np.isclose()

 print(x)
# output
tensor([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
         0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
         0., 1., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
         1., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
         0., 0., 0.],
])
np.where(np.all(np.isclose(labels, 0), axis=1))
(array([ 0, 3]),)

注意:这也适用于 PyTorch Tensors,当你想找到归零的 multihot 编码向量时,这非常有用。

原文由 crypdick 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题