2012-01-26 258 views
1

我有一個〜286 x 181 x 360的numpy數組(我們稱之爲測試),需要從中提取一個3-D數組。三維所需的範圍被定義爲其他numpy數組(a_dim,b_dim和c_dim)(最終基於用戶輸入)。天真地,我希望我能夠做一些像big_array [a_dim,b_dim,c_dim]的東西。那高興地跑時b_dim和c_dim只包含一個值(這發生在我的主要測試情況發生),但是當他們大於1用數組切片多維numpy陣列

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 

爲了簡化,考慮到不工作以下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]]]) 

或者,包含所有的行,列和頻帶的3D陣列(或任何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_()

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

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

AHA!謝謝。我很感激你發現 - 這讓我很瘋狂。 – 2012-01-27 00:09:50