2017-09-01 89 views
1

保持非零轴说我有以下3D阵列:优雅的方式来索引3D阵列,并使用numpy的

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

如果什么第一二维切片的第一关口都是零。输出会改变吗? – Divakar

+1

@Divakar对此感到抱歉。技术上你的示例中的输出不应该改变,尽管我正在使用的特定类型的数组看起来不是这样:如果[0,0,6]的第一列设置为全0,那么列那[0,0,15]也将全部为0。 –

+1

我明白了。因此,类似于发布的解决方案:'L [...,L.sum((0,1))!= 0]'。 – Divakar

回答

3

我们可以看看所有零沿第一两轴使用,用于屏蔽掉那些从第三轴 -

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] 
+0

有趣! “......”和“(0,1)”分别代表什么? –

+0

很酷。如果我只想去除沿轴= 1的和等于0的那个位置(即,不关心零行),解决方案会改变吗? –

+1

@ both-nor为那个添加一个样例: – Divakar