【问题标题】:How to check that a matrix contains a zero column?如何检查矩阵是否包含零列?
【发布时间】:2013-04-18 20:34:56
【问题描述】:

我有一个大矩阵,我想检查它的某处是否有一列全为零。如何在 numpy 中做到这一点?

【问题讨论】:

  • 如果有一列零,是需要列索引,还是只需要“是或否”?
  • @WarrenWeckesser 是或否
  • 一个不好的方法::尝试反转它:-P(如果它有一列全为零,它是单数)
  • @mgilson:反转矩阵并不是“有 0 列”的好测试:例如 [[1, 1], [1, 1]] 不能反转。
  • @mgilson:我认为“不好的方法”意味着它效率不高,而不是它不起作用。 :)

标签: python numpy


【解决方案1】:

这是一种方法:

In [19]: a
Out[19]: 
array([[9, 4, 0, 0, 7, 2, 0, 4, 0, 1, 2],
       [0, 2, 0, 0, 0, 7, 6, 0, 6, 2, 0],
       [6, 8, 0, 4, 0, 6, 2, 0, 8, 0, 3],
       [5, 4, 0, 0, 0, 0, 0, 0, 0, 3, 8]])

In [20]: (~a.any(axis=0)).any()
Out[20]: True

如果您后来决定需要列索引:

In [26]: numpy.where(~a.any(axis=0))[0]
Out[26]: array([2])

【讨论】:

  • where 是什么?好的,它指的是numpy.where
【解决方案2】:

创建一个equals 0 掩码 (mat == 0),并在其上沿轴运行all。

(mat == 0).all(axis=0).any()

【讨论】:

  • Warren Weckesser 的解决方案可能更快,因为any() 可能很早就停止检查非零行,而mat == 0 对数组的每个元素执行比较,这比较慢。
  • @EOL 是的,我同意。还 mat == 0 创建了一个与 mat 形状相同的临时 bool 数组,而 Warren 的 mat.any(axis=0) 只创建了一个大小为 mat.shape[1] 的临时一维数组,这是我的解决方案速度较慢的另一个原因(但可能有点对某些人来说更具可读性)。
  • 这种方法的优点是它更容易推广到更复杂的条件。
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2019-03-09
  • 2021-04-11
  • 2011-05-16
  • 2016-03-05
  • 1970-01-01
  • 2014-05-09
相关资源
最近更新 更多