【发布时间】:2023-03-07 08:50:01
【问题描述】:
我想对一个 numpy 数组进行切片以获得最后一维中的第 i 个索引。对于 3D 数组,这将是:
slice = myarray[:,:,i]
但我正在编写一个函数,我可以在其中获取任意维度的数组,因此对于 4D 数组,我需要myarray[:,:,:,i],依此类推。有没有一种方法可以为任何数组获取此切片,而无需显式编写数组维度?
【问题讨论】:
我想对一个 numpy 数组进行切片以获得最后一维中的第 i 个索引。对于 3D 数组,这将是:
slice = myarray[:,:,i]
但我正在编写一个函数,我可以在其中获取任意维度的数组,因此对于 4D 数组,我需要myarray[:,:,:,i],依此类推。有没有一种方法可以为任何数组获取此切片,而无需显式编写数组维度?
【问题讨论】:
有... 或Ellipsis,正是这样做的:
slice = myarray[..., i]
Ellipsis 是 python 对象,如果你想在方括号符号之外使用它。
【讨论】:
Ellipsis...
其实,刚刚找到了答案。正如numpy's documentation 中所述,这可以通过切片对象来完成。在我的特殊情况下,可以这样做:
idx = [slice(None)] * (myarray.ndim - 1) + [i]
my_slice = myarray[idx]
slice(None)相当于选择该索引中的所有元素,最后一个[i]选择最后一个维度的特定索引。
【讨论】:
slice() 对象的裸索引。也许你的意思是[slice(None)] * myarray.shape[-1] + [slice(None,i)]
[i]是正确的,但如果不使用Ellipsis,则第一部分必须是(myarray.ndim - 1)作为乘数。
在切片任意维度方面,之前的优秀答案可以扩展到:
indx = [slice(None)]*myarray.ndim
indx[slice_dim] = i
sliced = myarray[indx]
这将返回来自任何维度的切片 slice_dim - slice_dim = -1 再现了之前的答案。
为完整起见 - 上述清单的前两行可以简化为:
indx = [slice(None)]*(slice_dim) + [i] + [slice(None)]*(myarray.ndim-slice_dim-1)
虽然我发现以前的版本更具可读性。
【讨论】:
[Ellipsis] 部分需要更改为 [slice(None)],否则会出现“IndexError: an index can only have a single ellipsis” ('...')" 被提出。
slice - 我建议重命名该变量以避免问题。