在本周的奇怪日子里,我几乎可以理解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解决方案的修正 –