numpy 如何切片开始从负到一个积极的指数或相反

k5ifujac  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(157)

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

3duebb1j1#

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。注意多维索引的任何扩展。
在寻找全大小写替换时要小心。使用负索引从末尾开始标记,而不进行 Package ,在Python和numpy中根深蒂固,因此您应该始终假设这是默认行为。

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

把你的 Package /卷的情况作为一个例外,一个需要特殊处理。

cfh9epnr

cfh9epnr2#

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

我认为这相对简单。

ioekq8ef

ioekq8ef3#

如果你知道长度,你可以把数组的长度加到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]

相关问题