2017-09-01 2 views
1

使用して、非ゼロの軸を保つためには、私は、次の3次元配列を持っていると言う:L[0,:]ではゼロ列は常にL[1,:]にゼロの列が対応することで一致しているエレガントインデックス3次元配列への道と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]]]) 

私は今、軸に沿って合計が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

最初の2Dスライスの最初のCOLがすべてゼロであればどのような。出力は変わるでしょうか? – Divakar

+1

@Divakar混乱については申し訳ありません。あなたの例の出力は技術的に変更すべきではありませんが、私が扱っている配列の種類はそうではありません。[0,0,6]の最初の列がすべて0に設定されている場合、列[0,0,15]のすべての値も0になります。 –

+1

私は参照してください。だから、掲載された解答に似ています: 'L [...、L.sum((0,1))!= 0]'。 – Divakar

答えて

3

我々は最初の2つの軸に沿ってすべてゼロを探し、第3の軸からのものをマスクするためのものを使用することができます -

L[:,:,~(L==0).all(axis=(0,1))] 

また、~all()交換するany()を使用して - もっと上

L[...,~(L==0).all((0,1))] 
L[...,(L!=0).any((0,1))] 

- 私たちは:,:を交換しても、私たちのコンパクト版を与えるために引数axisをスキップするように省略記号表記...を使用することができます

L[:,:,(L!=0).any(axis=(0,1))] 

をNumPy配列の省略記号の意味はhereです。


質問の和の部分については、それは同様であろう -

L[...,L.sum((0,1))!=0] 
+0

面白い! '...'と '(0,1)'はそれぞれ何を意味しますか? –

+0

クール。軸= 1に沿った合計が0に等しい(つまり、行がゼロではない)部分を削除することにのみ関心がある場合は、ソリューションが変更されますか? –

+1

@ nor-norそのケースのサンプルケースを追加しますか? – Divakar

関連する問題