我有一个n维度numpy数组,我想获得-th维度的i第一个切片k.必须有比这更好的东西
# ...
elif k == 5:
b = a[:, :, :, :, :, i, ...]
# ...
Run Code Online (Sandbox Code Playgroud) 在一周的奇数天,我几乎可以理解numpy中的多维索引。Numpy具有函数“ take”,该函数似乎可以实现我想要的功能,但是额外的好处是,我可以控制如果索引超出范围时会发生什么情况。具体来说,我有一个3维数组作为查询表来询问
lut = np.ones([13,13,13],np.bool)
Run Code Online (Sandbox Code Playgroud)
和一个2x2的3个长向量数组,用作表的索引
arr = np.arange(12).reshape([2,2,3]) % 13
Run Code Online (Sandbox Code Playgroud)
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?)
Run Code Online (Sandbox Code Playgroud)
现在这三个术语的作用就好像它们已被压缩以生成2x2的元组数组并lut[<tuple>]从生成单个元素lut。最终结果是2x2的条目数组lut,正是我想要的。
我已经阅读了'take'功能的文档...
此功能与“奇特”索引(使用数组索引数组)具有相同的作用;但是,如果您需要沿给定轴的元素,则使用起来会更容易。
和
axis:int,可选
在其上选择值的轴。
也许天真地,我认为设置axis=2我将获得三个值以用作三元组来执行查找,但是实际上
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, …Run Code Online (Sandbox Code Playgroud)