2017-10-13 70 views
1

我有一个numpy数组,我需要(不改变原来的)相同的数组,但第一个项目放在最后。由于我使用这很多,我正在寻找干净的方式来获取此。 因此,例如,如果我的原始数组是[1,2,3,4],我想在不修改原始数组的情况下得到数组[4,1,2,3]。获取数组的第一个元素加上numpy的第一个元素(pythonic方式)

我找到了一个解决方案:

x = [1,2,3,4] 
a = np.append(x[1:],x[0])] 

但是,我要寻找一个更Python的方式。基本上是这样的:

x = [1,2,3,4] 
a = x[(:1,0)] 

但是,这当然是行不通的。有没有比使用append()函数更好的做我想做的事情?

回答

1

可以使用np.roll,如从文档:

沿给定轴线辊数组元素。

首先在 处重新引入超出最后位置的元素。

np.roll([1,2,3,4], 1) 
# array([4, 1, 2, 3]) 

在另一个方向上,使用负偏移:

np.roll([1,2,3,4], -1) 
# array([2, 3, 4, 1]) 
+1

有了'np.roll',你需要记住哪个方向为正,为负,虽然。我更喜欢'append'版本,因为它更加清晰。 – user2357112

2

np.roll是易于使用,但不是最快的方法。这是通用的,有多个维度和转变。

它的作用可以简化为:

def simple_roll(x): 
    res = np.empty_like(x) 
    res[0] = x[-1] 
    res[1:] = x[:-1] 
    return res 

In [90]: np.roll(np.arange(1,5),1) 
Out[90]: array([4, 1, 2, 3]) 
In [91]: simple_roll(np.arange(1,5)) 
Out[91]: array([4, 1, 2, 3]) 

时间测试:

In [92]: timeit np.roll(np.arange(1001),1) 
36.8 µs ± 1.28 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 
In [93]: timeit simple_roll(np.arange(1001)) 
5.54 µs ± 24.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 

我们也可以使用r_构建一个索引数组做副本。但它是慢(由于相对于切片高级索引):

def simple_roll1(x): 
    idx = np.r_[-1,0:x.shape[0]-1] 
    return x[idx] 
In [101]: timeit simple_roll1(np.arange(1001)) 
34.2 µs ± 133 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) 
相关问题