Python 如何从负索引开始切片到正索引或相反的索引
Numpy无法执行以下索引: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
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)