根据两列中的值移除numpy数组的行

2024-04-23 06:35:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个四列多行的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的所有行,结果是:

^{pr2}$

我可以一次只写一个专栏:

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

它返回第3列中的值不等于0的行。我可以对多个列进行迭代,但是在一个命令中完成这一切会很方便。在

我原以为下面两个例子会起作用(但事实并非如此):

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

希望有一些简单的语法我没有找到,在numpy帮助中找不到。在


Tags: or命令numpyobject语法数组array例子
3条回答

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

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

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

^{pr2}$

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

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)

这就产生了元素“和”。在

我把它改为!= 0,这样&就避免了用~进行额外的反转。在

您得到了使用or概念上正确的想法。主要的区别在于,您希望执行逻辑or(|)或逻辑and(&)(就像使用逻辑not(~))一样。在

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

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

另一种计算遮罩的方法如下:

^{pr2}$

np.logical_and.reduce通过对行应用np.logical_and(这是一个处理&运算符的函数)来缩小列(axis=1)的输入数组,因此每一行的选定部分的所有元素都为True。在

相关问题 更多 >