说我有以下3D数组:
L=np.arange(18).reshape((2,3,3))
L[:,:,1] = 0; L[:,[0,1],:] = 0
In []: L
Out[]:
array([[[ 0, 0, 0],
[ 0, 0, 0],
[ 6, 0, 8]],
[[ 0, 0, 0],
[ 0, 0, 0],
[15, 0, 17]]])
其中L[0,:]
中的零列总是与L[1,:]
中的相应零列匹配。
我想现在删除中间列,其中沿轴的总和等于0(忽略行为零。我目前的笨拙方法是
l=np.nonzero(L.sum(axis=1))[1]
In []: L[:,:,l[:len(l)/2]]
Out[]:
array([[[ 0, 0],
[ 0, 0],
[ 6, 8]],
[[ 0, 0],
[ 0, 0],
[15, 17]]])
这样做的迂回方式是什么?
答案 0 :(得分:4)
我们可以沿着前两个轴查找全零,并使用它来屏蔽第三个轴的那些 -
L[:,:,~(L==0).all(axis=(0,1))]
或者,使用any()
替换~all()
-
L[:,:,(L!=0).any(axis=(0,1))]
我们可以使用省略号符号...
来替换:,:
,也可以跳过arg axis
来为我们提供紧凑版本 -
L[...,~(L==0).all((0,1))]
L[...,(L!=0).any((0,1))]
更多关于省略号如何为NumPy数组工作here
。
对于问题的总和部分,它将是类似的 -
L[...,L.sum((0,1))!=0]