结合两个切片操作

Mag*_*n88 6 python numpy

是否有一种智能且简单的方法将两个切片操作合二为一?

说我有类似的东西

arange(1000)[::2][10:20]
>>> array([20, 22, 24, 26, 28, 30, 32, 34, 36, 38])
Run Code Online (Sandbox Code Playgroud)

当然在这个例子中这不是问题,但如果数组非常大,我非常想避免创建中间数组(或者没有?).我认为应该可以将两个切片结合起来,但也许我正在监督某些事情.所以这个想法是这样的:

arange(1000)[ slice(None,None,2) + slice(10,20,None) ]
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,但我想做的.是否有任何组合切片对象?(尽管我的努力,我没有找到任何东西).

Tig*_*uev 5

  1. 您可以创建子类slice以使切片的这种叠加成为可能。只需覆盖__add__(或__mul__- 数学家肯定更喜欢*叠加符号)。但它会调用一些数学。顺便说一句,你可以用这些东西制作一个不错的 Python 包 ;-)
  2. 正如bheklilr所说,在 NumPy 中切片不需要任何成本。所以你可以继续使用一个简单的解决方案,比如切片列表。

PS一般来说,可以使用多重切片使代码更好、更清晰。甚至在以下几行之一之间进行简单的选择:

v = A[::2][10:20]
v = A[20:40][::2]
v = A[20:40:2]
Run Code Online (Sandbox Code Playgroud)

能深刻反映程序逻辑,使代码自文档化。

再举一个例子:如果你有一个扁平的 NumPy 数组,并且你希望在positionlength 的位置提取一个子数组length,你可以这样做

v = A[position : position + length]
Run Code Online (Sandbox Code Playgroud)

或者

v = A[position:][:length]
Run Code Online (Sandbox Code Playgroud)

自己决定哪个选项看起来更好。;-)