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

2024-09-27 23:19:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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_]

Tags: 代码numpyyou编辑getnp方式情况
3条回答
def slicer(a, lower, upper):
    if lower < 0:
        return np.concatenate((a[lower:], a[:upper]))
    else:
        return a[lower: upper]

我认为这相对简单

如果您知道长度,则只需将数组的长度添加到lower和upper中即可<;0然后,您可以检查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]

In [71]: slicer(np.arange(10),-2,2)                                                                    
Out[71]: array([8, 9, 0, 1])

看起来np.r_做了您想要的那种“滚动”:

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_所做的之间可能存在差异。我会让你研究它的文件

就因为你称之为切片,它不是basic索引。然而,结果是copy,而不是view。还要注意对多维索引的任何扩展

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

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

将您的包装/卷箱视为例外,需要特殊处理

相关问题 更多 >

    热门问题