2016-11-12 110 views
0

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

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

有没有一种通用的方法来完成这一行?

+1

哪些输入(输入数组和输入参数),什么是对的样本预期的输出?实质上,你可以将示例代码转换为函数格式吗? – Divakar

+0

'padding'是什么意思? – Eric

回答

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] 
+0

可能的一个班轮:'np.roll(a,i)[slice(i,None)if i> 0 else(slice(None,i)if i <0 else slice(None))]' – hpaulj

+0

@hpaulj:A如果我<= 0 else a [: - i]' – Eric

+0

'np.s_ [i:]'也是IMO拼写'slice(i,None)的更好方法, ' – Eric

0

为什么你甚至在这里使用roll?整个关键点是创建环绕行为,这正是您似乎试图消除的特征。一个简单的切片就足够了:

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

此功能完全相同的行为作为一个在David's answer