在本週的奇怪日子裏,我幾乎可以理解numpy中的多維索引。 NumPy的具有功能'take'這似乎做我想做的,但有額外的獎勵,我可以控制,如果索引超出rangect 具體發生了什麼,我有一個3維數組問的查找表numpy多維索引和函數'take'
lut = np.ones([13,13,13],np.bool)
和3-長矢量的2×2陣列充當索引到表
arr = np.arange(12).reshape([2,2,3]) % 13
IIUC,如果我是寫lut[arr]
然後arr
被視爲數字的2x2x3陣列和這些使用時作爲索引到lut
他們每個返回一個13x13陣列。這解釋了爲什麼lut[arr].shape is (2, 2, 3, 13, 13)
。
我可以通過寫
lut[ arr[:,:,0],arr[:,:,1],arr[:,:,2] ] #(is there a better way to write this?)
,現在這三個方面作爲,如果他們已經進行了壓縮,以產生一個元組的2x2的陣列和lut[<tuple>]
從lut
產生一個單一的元素讓它做我想做的。最後的結果是一個來自lut
的2x2數組條目,正是我想要的。
我已經閱讀了「採取」函數的文檔...
這個函數做同樣的事情,「花哨」索引 (使用數組索引陣列);但是,如果您需要沿給定軸的元素,則使用 更容易。
和
軸:整數,可選
在其上選擇值的軸線。
也許天真,我以爲設置axis=2
我會得到三個值作爲3元組使用進行查找,但實際上
np.take(lut,arr).shape = (2, 2, 3)
np.take(lut,arr,axis=0).shape = (2, 2, 3, 13, 13)
np.take(lut,arr,axis=1).shape = (13, 2, 2, 3, 13)
np.take(lut,arr,axis=2).shape = (13, 13, 2, 2, 3)
所以很顯然,我不明白是怎麼回事上。任何人都可以告訴我如何實現我想要的?
對於它的價值,'np.take'等同於對'lut.flat'進行索引:'lut.flat [np.ravel_multi_index(arr.T,lut.shape)]。T' – hpaulj
謝謝無論是爲您的解決方案由於ravel_multi_index允許剪輯,我根本不需要'take',所以我將使用@ hjpauli對Divakar解決方案的修正 –