根据两个列中的值删除Numpy数组的行



我有一个带有四个列和许多行的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列中值的行,我可以对多列进行迭代进行此操作,但是一一命令将其全部完成很方便。

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

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

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

假设数据阵列为 2D,我们可以切片并查找有效的数组 -

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

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

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

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

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

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

使用 &

>>> 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)

产生元素的"one_answers"。

我已经为!= 0更改了它,因此&避免使用~的其他反转。

您有概念上正确使用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)的输入数组。

最新更新