Python 如何从负索引开始切片到正索引或相反的索引

Python 如何从负索引开始切片到正索引或相反的索引,python,numpy,Python,Numpy,Numpy无法执行以下索引: a = np.arange(10) a[-2: 2] 我现在做这件事的方式不是很优雅,有什么诀窍或妙计可以做到这一点吗 编辑:请注意,我不知道在我的代码中是否会遇到这种情况,这种情况有时会发生,所以我正在寻找一种动态的、一对所有的解决方案,而不仅仅是针对这种情况 编辑: 我的广义切片器,相当长 def slicer(array, lower_, upper_): n = len(array) lower_ = lower_ % n # if n

Numpy无法执行以下索引:

a = np.arange(10)
a[-2: 2]

我现在做这件事的方式不是很优雅,有什么诀窍或妙计可以做到这一点吗

编辑:请注意,我不知道在我的代码中是否会遇到这种情况,这种情况有时会发生,所以我正在寻找一种动态的、一对所有的解决方案,而不仅仅是针对这种情况

编辑: 我的广义切片器,相当长

def slicer(array, lower_, upper_):
    n = len(array)
    lower_ = lower_ % n  # if negative, you get the positive equivalent. If > n, you get principal value.
    roll = lower_
    lower_ = lower_ - roll
    upper_ = upper_ - roll
    array_ = np.roll(array, -roll)
    upper_ = upper_ % n
    return array_[lower_: upper_]
def切片器(a、下部、上部):
如果低于0:
返回np.concatenate((a[lower:],a[:upper]))
其他:
返回a[下:上]

我认为这相对简单

假设您知道长度,如果数组的长度小于0,您可以将其添加到lower和upper。然后,您可以检查upper是否小于lower,并在必要时连接

def slicer(a, lower, upper):
    if lower < 0:
        lower += len(a)
    if upper < 0:
        upper += len(a)
    if upper < lower:
        return np.concatenate([a[lower:], a[:upper]])
    return a[lower:upper]

def切片器(a、下部、上部):
如果低于0:
下+=透镜(a)
如果上限<0:
上+=透镜(a)
如果上部<下部:
返回np.concatenate([a[lower:],a[:upper]]))
返回a[下:上]
它看起来像是
np.r\uu
做了你想要的那种“滚动”:

In [72]: np.arange(10)[np.r_[-2:2]]                                                                    
Out[72]: array([8, 9, 0, 1])
In [73]: np.r_[-2:2]                                                                                   
Out[73]: array([-2, -1,  0,  1])
您所期望的和
r\u
所做的可能会有所不同。我会让你研究它的文件

仅仅因为你称之为切片,它就不是基本的索引。不管怎样,结果都是
复制
,而不是
视图
。还要注意对多维索引的任何扩展

在寻找全套替换件时要小心。在Python和numpy中,使用负索引从末尾进行标记(不进行包装)是如此深入,以至于您应该始终假定这是默认行为

In [77]: np.arange(10)[-2:2]                                                                           
Out[77]: array([], dtype=int64)

将包装/滚动的情况视为例外情况,需要特殊处理。

你不能简单地说:a[-2:]+a[:2]@PeterPesch首先,你假设Python列表不是numpy数组,+adds不连接。第二,是的,当然,但我不知道这将在我的程序中发生在哪里/什么时候,所以我做了这个把戏。
b=a.tolist()
np.array(b[-2::+b[:2])
是一个双线数组solution@rpoleski谢谢,但我不知道情况是否确实如此。i、 我不知道我是否一开始就面临这样的情况,所以我希望它是动态的,适用于所有情况。我会更新这个问题,让它更清楚。有一件事有点奇怪,那就是lower和upper都是负数,但是lower>upper。在这种情况下,您将环绕整个阵列,这是意料之中的,但仍然有点奇怪。确实如此。在这种情况下,它相当于
np.arange(10)[8:-2]
并返回
[]
。使它为
a[8:2]
工作与您在问题中所问的不同
np.arange(10)[8:2]
返回空数组(在我的代码中是相同的),并且您没有表示您的预期结果不同。谢谢。我在等你的回答。我知道你提到的所有这些微妙之处
np.r
似乎解决了一半的问题,比如在切片时从负指数跳到正指数。但它肯定不适用于
a[8:2]
,其中
a
的大小为10。在本例中,从数组的另一端跳到它的起点。好的,你建议我作为一个例外手动处理它。谢谢
In [77]: np.arange(10)[-2:2]                                                                           
Out[77]: array([], dtype=int64)