【问题标题】:Remove row of numpy array based on values from two columns根据两列中的值删除一行 numpy 数组
【发布时间】:2016-12-30 21:33:16
【问题描述】:

我有一个四列多行的 numpy 数组:

>>> dat
array([['4/5/2004', '17', 0.0, 0.0],
   ['4/5/2004', '7', 0.0, 0.0],
   ['4/5/2004', '19:48:20', 58.432488, -135.9202205],
   ['4/5/2004', '19:48:32', 58.432524300000004, 0.0],
   ['4/5/2004', '19:48:36', 58.4325365, -150.9202813]], dtype=object)  

我想删除第 3 列或第 4 列中的值等于 0 的所有行,因此结果将是:

   ([['4/5/2004', '19:48:20', 58.432488, -135.9202205],
   ['4/5/2004', '19:48:36', 58.4325365, -150.9202813]])

我可以一次做一列:

a = dat[~(dat[:,2]==0), :]  

它返回第 3 列中的值不等于 0 的行。我可以对多列迭代地执行此操作,但在一个命令中完成所有操作会很方便。

我认为类似以下两个示例的方法会起作用(但它们不起作用):

a = dat[~(dat[:,2]==0), :] or dat[~(dat[:,3]==0), :] 
a = dat[~(dat[:,2&3]==0), :]

希望我缺少一些简单的语法,并且在 numpy 帮助中找不到。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    假设数据数组是2D,我们可以切片并寻找有效的-

    dat[~(dat[:,2:4]==0).any(1)]
    

    或者,我们可以在!=0 上使用np.all -

    dat[(dat[:,2:4]!=0).all(1)]
    

    当感兴趣的列不连续时,我们需要使用这些列 ID 对它们进行切片并使用相同的技术。因此,假设要检查的列 ID 存储在名为 colID 的数组或列表中,那么我们将修改方法,如下所示 -

    dat[~(dat[:,colID]==0).any(1)]
    dat[(dat[:,colID]!=0).all(1)]
    

    因此,对于第 3 列和第 4 列的规定情况,我们将有:colID = [2,3]

    【讨论】:

    • 你可以做2:4 -> 2:
    • 嘿,我喜欢你做逻辑和/或减少的方式。
    • 所有答案都完全符合我的要求。我选择这个是因为这个命令看起来最简洁。
    • @MadPhysicist 来自 MATLAB 背景,我首先想到的是 :)
    • 有道理。我也来自 MATLAB,但 numpy 已经有一段时间是我的生计了,所以 reduce 先跳出来。
    【解决方案2】:

    &怎么样:

    >>> dat[(dat[:,2] != 0) & (dat[:,3] != 0), :]
    array([['4/5/2004', '19:48:20', 58.432488, -135.9202205],
           ['4/5/2004', '19:48:36', 58.4325365, -150.9202813]], dtype=object)
    

    这会产生逐元素的“和”。

    我已将其更改为!= 0,因此& 避免了~ 的额外反转。

    【讨论】:

      【解决方案3】:

      你得到了使用or 在概念上正确的想法。主要区别在于您要执行逻辑或 (|) 或逻辑与 (&)(就像您使用逻辑非 (~))。

      这是因为像dat[:,3] == 0 这样的操作会创建一个与dat 的列大小相同的数组或布尔值。当此数组用作索引时,numpy 将其解释为掩码。拆分掩码数组以突出这个概念:

      mask = (dat[:, 2] != 0) & (dat[:, 3] != 0)
      dat = dat[mask, :]
      

      另一种计算掩码的方法如下:

      mask = np.logical_and.reduce(dat[:, 2:] != 0, axis=1)
      

      np.logical_and.reduce 通过将np.logical_and(处理& 运算符的函数)应用于行来缩小列(axis=1)的输入数组,因此您会得到一个 True,其中所有元素每行的选定部分为 True。

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        相关资源
        最近更新 更多