滚动numpy数组没有填充?

时间:2016-11-12 16:37:11

标签: python numpy

我有一个数组a = np.arange(10)。我想使用np.roll,其中转变可以是正面的,也可以是负面的。然后我想使用索引来删除已填充到数组的开头(如果移位为正)或结束(如果移位为负)的元素。例如:

>>> a = np.arange(10)
>>> np.roll(a, 1)[1:]
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> np.roll(a, -1)[:-1]
array([1, 2, 3, 4, 5, 6, 7, 8, 9])  

是否有一种通用的方法可以在一行中实现这一目标?

2 个答案:

答案 0 :(得分:1)

我认为不可能以通用(非硬编码方式)执行此操作。但是编写一个能够满足您需求的简短函数非常容易。

def roll2(arr, i):
    """Roll and clip array"""
    if i == 0:
        return arr
    elif i > 0:
        s = slice(i, None)
    else:
        s = slice(None, i)
    return np.roll(a, i)[s]

答案 1 :(得分:0)

为什么你在这里使用roll?滚动的全部意义在于创建环绕行为,这正是您似乎想要消除的功能。一个简单的切片就足够了:

def shift_right(arr, i):
    if i <= 0:
        return arr[-i:]
    else:
        return arr[:-i]

此功能与David's answer

中的功能完全相同