2017-02-22 7 views
2
import numpy as np 
a = np.zeros((10,20,30)) 

、IND1及びnumpyのアレイ多次元インデックス付け:形状の第二及び第三の次元の要素を抽出するミスマッチ

ind1 = [0,5,6] 
ind2 = [1,2,7,8] 
a[:,ind1,ind2] 

コマンド上のインデックスのリストはIndexErrorをIND2与えるれる:形状不一致

次のようにインデックスを作成する場合

a1 = a[:,ind1,:] 
a2 = a1[:,:,ind2] 

ind1とind2のメンテナンスが同じ場合、インデックス作成が機能します。

多次元配列のインデックスリストは同じ形状である必要がありますか?

答えて

1

出力の形状はインデックス配列の形状によって決まるので、同じでなければなりません。

というか互換性のある、以下の

i1, i2 = np.ix_(ind1, ind2) 
a[:, i1, i2] 

は動作します。 ind1、ind2(i1、i2はshape(3,1)(1,4)であるため、それらが一緒にブロードキャストされる)のすべての組み合わせを選択することによって、10x3x4配列を生成します。対照的に、ind1とind2が一致しなければならないind1とind2の対応する要素を選択するだけである(「ind1」と「ind2」が非ブロードキャスト可能な場合)。

はここ

>>> z = np.zeros((5,5), int) 
>>> a = [1,2,4] 
>>> z[a,a] = 1 
>>> z # 3 points set 
array([[0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1]]) 
>>> a1,a2 = np.ix_(a,a) 
>>> z[a1,a2] = 1 
>>> z # 3x3 points set 
array([[0, 0, 0, 0, 0], 
     [0, 1, 1, 0, 1], 
     [0, 1, 1, 0, 1], 
     [0, 0, 0, 0, 0], 
     [0, 1, 1, 0, 1]]) 
1

パウロの答えは、おそらくあなたの質問に答えるの違いを示すために、単純な例ですが、私はあなたがそれらのインデックスを使用して、両方を同時に行っているので、あなたがあれば、それは、動作しませんことがわかりました次の操作を行います。

a[:,ind1,:][:,:,ind2] 

それはインデックスエラーに

+0

ニーストリックを取得していません。 'np.ix_'メソッドと同じ出力を与えるべきです。もちろん、通常は 'np.ix_'がより効率的になりますが、あなたのタイプは少なくなります。 –

+0

@PaulPanzerうん、あなたの解決策は、numpyの作成者が推奨する方法だと思う:p – Harlekuin

関連する問題