如何根据条件从 numpy 数组中删除一行?

Posted

技术标签:

【中文标题】如何根据条件从 numpy 数组中删除一行?【英文标题】:How to delete a row based on a condition from a numpy array? 【发布时间】:2018-05-28 21:14:12 【问题描述】:

来自以下数组:

test = np.array([[1,2,'a'],[4,5,6],[7,'a',9],[10,11,12]])

如何删除包含 'a' 的行? 预期结果:

array([[ 4,  5,  6],
   [10, 11, 12]])

【问题讨论】:

【参考方案1】:

注意,numpy 支持向量化比较:

>>> test
array([[1, 2, 'a'],
       [4, 5, 6],
       [7, 'a', 9],
       [10, 11, 12]], dtype=object)
>>> test == 'a'
array([[False, False,  True],
       [False, False, False],
       [False,  True, False],
       [False, False, False]], dtype=bool)

现在,您希望 all 不等于 'a'rows

>>> (test != 'a').all(axis=1)
array([False,  True, False,  True], dtype=bool)

所以,只需选择带有掩码的行:

>>> row_mask = (test != 'a').all(axis=1)
>>> test[row_mask,:]
array([[4, 5, 6],
       [10, 11, 12]], dtype=object)

【讨论】:

感谢您的出色回答。我试图用 np.where 函数找到解决方案,但我没有。再次感谢。 @GF 你可以使用np.where,但我认为解决方案会不太干净,除非你专门寻找值 where 什么都可以。当您只需要行或列时,问题是您必须执行额外的步骤来查找唯一索引...【参考方案2】:

另外,可能是这样吗? (灵感来自我的another answers 之一)

In [100]: mask = ~(test == 'a')

In [101]: mask
Out[101]: 
array([[ True,  True, False],
       [ True,  True,  True],
       [ True, False,  True],
       [ True,  True,  True]], dtype=bool)

In [102]: test[np.all(mask, axis=1), :]
Out[102]: 
array([['4', '5', '6'],
       ['10', '11', '12']],
      dtype='<U21')

但是,请注意,这里我们不会 删除原始数组中的任何行。我们只是切掉没有字母 a 的行。

【讨论】:

也不错。谢谢;)【参考方案3】:

总结起来有几种可能的方式,比如:

test[np.all(test != 'a', axis=1), :]

或者

test[(test != 'a').all(axis=1)]

【讨论】:

以上是关于如何根据条件从 numpy 数组中删除一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据numpy中的条件分割异构数组?

从给定的 2D numpy 数组中删除集群

如何从数组的numpy数组中删除外部数组[重复]

如何从 NumPy 数组中删除所有零元素?

如何从 numpy nd 数组中删除特定元素?

如何伸缩 numpy 数组的列?