我正在寻找有关如何在Python中反转切片的通用方法.
我阅读了这篇综合性的文章,其中对切片的工作方式进行了一些不错的解释:
Understanding Python’s slice notation
但是,我无法找出关于如何计算反向切片的通用规则,该反向切片可以完全相反地处理相同的元素.实际上,我很惊讶没有找到一个内置的方法来做到这一点.
我正在寻找的是reversed_slice方法,该方法可以像这样使用任意的起始值,终止值和步长值(包括负值):
>>> import numpy as np
>>> a = np.arange(30)
>>> s = np.s_[10:20:2]
>>> a[s]
array([10, 12, 14, 16, 18])
>>> a[reversed_slice(s,len(a))]
array([18, 16, 14, 12, 10])
我尝试过但不起作用的是这样的:
def reversed_slice(slice_, len_):
"""
Reverses a slice (selection in array of length len_),
addressing the same elements in reverse order.
"""
assert isinstance(slice_, slice)
instart, instop, instep = slice_.indices(len_)
if instep > 0:
start, stop, step = instop - 1, instart - 1, -instep
else:
start, stop, step = instop + 1, instart + 1, -instep
return slice(start, stop, step)
这对于步骤1以及最后寻址的元素与stop-1一致时都适用.对于其他情况,它不会:
>>> import numpy as np
>>> a = np.arange(30)
>>> s = np.s_[10:20:2]
>>> a[s]
array([10, 12, 14, 16, 18])
>>> a[reversed_slice(s,len(a))]
array([19, 17, 15, 13, 11])
因此,似乎我缺少某种关系,例如(停止-开始)%step.
非常感谢您提供有关如何编写通用方法的帮助.
笔记:
>我确实知道还有其他可能性可以使具有相同元素的序列反转,例如调用reversed(a [s]).这不是一个选项,因为我需要反转切片本身.原因是我处理的是h5py数据集,该数据集不允许切片中使用负步进值.
>一种简单但不是很优雅的方法是使用坐标列表,即a [list(reversed(range(* s.indices(len(a)))))].由于h5py要求列表中的索引必须以递增顺序给出,因此这也不是一种选择.