2017-10-13 68 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) 
相關問題