我有一个四列多行的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帮助中找不到。在
假设数据数组是
2D
,我们可以切片并查找有效的数组-或者,我们可以在
^{pr2}$!=0
上使用np.all
当感兴趣的列不是连续的列时,我们需要使用这些列id对它们进行切片,并使用相同的技术。所以,假设要检查的列id存储在一个名为
colID
的数组或列表中,那么我们将修改方法,如下-因此,对于列3和列4的情况,我们将得到:
colID = [2,3]
。在使用
&
:这就产生了元素“和”。在
我把它改为
!= 0
,这样&
就避免了用~
进行额外的反转。在您得到了使用
or
概念上正确的想法。主要的区别在于,您希望执行逻辑or(|
)或逻辑and(&
)(就像使用逻辑not(~
))一样。在这是因为像
dat[:,3] == 0
这样的操作会创建一个或多个与dat
列大小相同的布尔函数。当此数组用作索引时,numpy
将其解释为掩码。拆分遮罩阵列以突出这个概念:另一种计算遮罩的方法如下:
^{pr2}$np.logical_and.reduce
通过对行应用np.logical_and
(这是一个处理&
运算符的函数)来缩小列(axis=1
)的输入数组,因此每一行的选定部分的所有元素都为True。在相关问题 更多 >
编程相关推荐