第一任意维度的块状切片

时间:2018-09-21 14:59:55

标签: python numpy

关于切片最后一个维度有一个很棒的问题/答案: Numpy slice of arbitrary dimensions:要切片一个numpy数组以获得最后一个维度的第i个索引,可以使用...或省略号,

slice = myarray[...,i]

如果需要前N个尺寸怎么办?

对于3D myarray,N = 2:

slice = myarray[:,:,0]

对于4D myarray,N = 2:

slice = myarray[:,:,0,0]

这可以推广到任意维度吗?

1 个答案:

答案 0 :(得分:2)

我认为没有内置的语法糖,但是切片就像其他对象一样。 slice(None)对象是从:创建的,否则仅选择索引0即可正常工作。

myarray[(slice(None),)*N+(0,)*(myarray.ndim-N)]

请注意(slice(None),)中的逗号。除非括号为空,否则默认情况下,Python不会根据括号创建元组。逗号表示不仅要计算内部内容。

切片很好,因为它们为您提供了对对象的视图,而不是对象的副本。您可以使用相同的想法,例如,对除第N维之外的所有对象进行迭代。对此有一些stackoverflow问题,它们几乎一致地求助于滚动索引和我认为在高维空间中难以推理的其他事情。切片元组是您的朋友。

@PaulPanzer从评论中指出了我更喜欢的另一种技术。

myarray.T[(myarray.ndim-N)*(0,)].T

首先,numpy中的转置是视图操作,而不是复制操作。这一点也不是没有效率的。运作方式如下:

  1. myarray开始,尺寸为(0,...,k)
  2. 转置myarray.T将其重新排序为(k,...,0)
  3. 整个目标是修复原始数组中的最后myarray.ndim-N个维度,因此我们选择具有[(myarray.ndim-N)*(0,)]的那些,从而从该数组中获取第一个myarray.ndim-N个维度。
  4. 它们的顺序错误。我们有尺寸(N-1,...,0)。与.T一起使用另一个转置来获取顺序(0,...,N-1)。