【发布时间】:2017-07-23 06:00:05
【问题描述】:
在一周中的奇数天,我几乎了解 numpy 中的多维索引。 Numpy 有一个函数'take',它似乎可以做我想做的事,但额外的好处是,如果索引超出范围,我可以控制会发生什么 具体来说,我有一个 3 维数组作为查找表来询问
lut = np.ones([13,13,13],np.bool)
和一个 2x2 的 3 长向量数组作为表的索引
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 条目数组,正是我想要的。
我已经阅读了“take”功能的文档...
此功能与“花式”索引功能相同 (使用数组索引数组);但是,它可以更容易 如果您需要沿给定轴的元素,请使用。
和
轴:int,可选
选择值的轴。
也许天真地,我认为设置 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)
所以很明显我不明白发生了什么。谁能告诉我如何实现我想要的?
【问题讨论】:
标签: python numpy multidimensional-array indexing