2017-05-02 13 views
-1

複数のスライス配列を使用して別々の次元に沿ってndarrayをスライスしようとすると、numpyブロードキャストエラーの原因を理解できません。 dataインデックス配列picks(例:np.arange(2,306,3))とブール値配列mask(ここで、mask.shapeは(481))を使用して、第1次元と第2次元に沿ってndarray(100,306,481) )のうち、361個の要素がTrueです。Numpy ndarrayが配列でスライスする

data[:, picks, mask]戻り

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (102,) (361,)

しかしdata[:, :, mask]data[:, picks, :]、およびdata[:, :10, mask]作業予想通り。

この場合、どのように放送が行われますか?これを行うためのpythonicの方法は何ですか? picksは(361)の要素を持っていた

+0

に便利です'(100、len(picks)、len(mask))'のような形状のスライスであれば、 'data [:、picks [:, np.newaxis]、マスク] '。 '(m、)'と '(n、)'の形で配列を放送することはできませんが、 '(m、1)'と '(n、)'で行うことができます。 –

+0

また、関数 'np.ix_'をチェックすることもできます。上記は 'data [np.ix_(arange(100)、picks、mask)]'に相当します。 –

答えて

2

ので

data[:, :, mask] => (100, 306, 361) 
data[:, :10, mask] => (100, 10, 361) 
data[:, picks, :] => (100, 102, 481) 

場合、

data[:, picks, mask] => (100, 361) # I think :) 

しかし、別の次元のインデックスへnp.where(mask)は、picksが列にする必要があり、一致picksのだと思いますベクトルであるので、(102,1)は(1,361)で放送し、(102,361)選択を生成する

data[:, picks[:,None], mask] => (100, 102, 361) # again I need to test 

だから、いくつかのテストアレイを作成:あなたがしたい場合

In [253]: data=np.ones((100,306,481)) 
In [254]: picks=np.arange(2,306,3) 
In [255]: mask=np.zeros(481,bool) 
In [256]: mask[:361]=True 
In [257]: data[:, picks[:,None],mask].shape 
Out[257]: (100, 102, 361) 

arangeが

In [259]: data[:, 2::3, mask].shape 
Out[259]: (100, 102, 361) 

ix_スライスに置き換えることもできるが、この場合

In [268]: I,J=np.ix_(picks,mask) 
In [269]: I.shape 
Out[269]: (102, 1) 
In [270]: J.shape 
Out[270]: (1, 361) 
In [271]: data[:,I,J].shape 
Out[271]: (100, 102, 361) 
関連する問題