71

我想切片一个 numpy 数组以获得最后一维中的第 i 个索引。对于 3D 数组,这将是:

slice = myarray[:,:,i]

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

4

3 回答 3

110

...or Ellipsis,它正是这样做的:

slice = myarray[..., i]

Ellipsis 是 python 对象,如果您想在方括号表示法之外使用它。

于 2012-08-24T21:24:33.110 回答
17

其实,刚刚找到答案。正如numpy 的文档中所述,这可以通过 slice 对象来完成。在我的特殊情况下,这样做可以:

idx = [slice(None)] * (myarray.ndim - 1) + [i] 
my_slice = myarray[idx]

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

于 2012-08-24T21:29:39.780 回答
11

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

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)

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

于 2013-03-18T22:37:05.400 回答