使用Numpy索引3D阵列并保持非零轴的优雅方式

时间:2017-09-01 21:08:08

标签: python numpy indexing

说我有以下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]]])

这样做的迂回方式是什么?

1 个答案:

答案 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]