2012-01-26 9 views
1

〜286 x 181 x 360の配列を持つ(私たちはそれをtestと呼ぶ)、そこから3次元配列を抽出する必要があります。 3つの次元に必要な範囲は、(ユーザ入力に基づいて)他のnumpy配列(a_dim、b_dim、およびc_dim)として定義されます。素朴に、私はbig_array [a_dim、b_dim、c_dim]のようなことをすることができると思っていました。 b_dimと、彼らは簡単にするため1配列で多次元配列をスライスする

Traceback (most recent call last): 
    File "<pyshell#541>", line 1, in <module> 
    test[a_dim,b_dim,c_dim] 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

よりも大きいいるときに(私のメインのテストケースで発生することが起こった)単一の値のみが含まれていc_dimが、動作しませんが、与えられたとき、それは喜んで走りました4つのアレイの次

test=arange(125).reshape((5,5,5)) 
a_dim=[0,1] 
b_dim=[1,2] 
c_dim=[2,3] 

私は上記のものの組み合わせからの出力として取得したいのですが次のとおりです。

array([[[ 7, 8], 
     [12, 13]], 

     [[32, 33], 
     [37, 38]]]) 

または、行、列、およびバンド(のすべてを含む3次元配列または何でもy a_dim、b_dim、およびc_dimで定義されています)。私はこのためにix_使用してみましたが、明らかに私が見てきた例から何かが欠けています:

>>> test[ix_((a_dim,b_dim,c_dim))] 

Traceback (most recent call last): 
    File "<pyshell#517>", line 1, in <module> 
    test[ix_((a_dim,b_dim,c_dim))] 
    File "C:\Python27\lib\site-packages\numpy\lib\index_tricks.py", line 73, in ix_ 
    raise ValueError, "Cross index must be 1 dimensional" 
ValueError: Cross index must be 1 dimensional 

任意の提案を? ありがとう!

答えて

1

とても近い - ちょうどnumpy.ix_()への呼び出しに括弧のペアを1つ取り除く:

>>> test[ix_(a_dim,b_dim,c_dim)] 
array([[[ 7, 8], 
     [12, 13]], 

     [[32, 33], 
     [37, 38]]]) 
+0

AHA!ありがとう。私はそれを見つけていただきありがとうございます - それは私をナッツにしていました。 –