Numpy切片的任意尺寸

tia*_*ago 43 python numpy

我想切片一个numpy数组来获取最后一个维度的第i个索引.对于3D阵列,这将是:

slice = myarray[:,:,i]
Run Code Online (Sandbox Code Playgroud)

但我正在编写一个函数,我可以采用任意维度的数组,因此对于我需要的4D数组myarray[:,:,:,i],依此类推.有没有办法可以为任何数组获取此切片而无需显式地编写数组维度?

seb*_*erg 69

...或者Ellipsis,确实如此:

slice = myarray[..., i]
Run Code Online (Sandbox Code Playgroud)

省略号是python对象,如果你想在方括号表示法之外使用它.


tia*_*ago 12

实际上,刚刚找到答案.正如numpy的文档中所述,这可以使用切片对象完成.在我的特定情况下,这样做:

idx = [slice(None)] * (myarray.ndim - 1) + [i] 
my_slice = myarray[idx]
Run Code Online (Sandbox Code Playgroud)

slice(None)相当于选择该索引中的所有元素,而last [i]选择最后一个维度的特定索引.

  • @NiklasB.最后一个`[i]`是正确的,但如果没有使用'省略号',则第一部分必须是`(myarray.ndim - 1)`乘法器. (2认同)
  • 我喜欢这个答案,但我不喜欢切片对象立即被覆盖 (2认同)
  • @Snoozer:修复了! (2认同)

jme*_*etz 11

在切片任意维度方面,之前的优秀答案可以扩展为:

indx = [slice(None)]*myarray.ndim
indx[slice_dim] = i
sliced = myarray[indx]
Run Code Online (Sandbox Code Playgroud)

这将返回任何维度的切片slice_dim-slice_dim = -1重现以前的答案。为完整起见 - 上述清单的前两行可以浓缩为:

indx = [slice(None)]*(slice_dim) + [i] + [slice(None)]*(myarray.ndim-slice_dim-1)
Run Code Online (Sandbox Code Playgroud)

虽然我发现以前的版本更具可读性。