2014-02-13 45 views
5

解釋具有非常簡單的方法來插入元件:插入元件插入到numpy的陣列

a = [1,2,3,4] 
a.insert(2,66) 
print a 
[1, 2, 66, 3, 4] 

對於numpy陣列I可以這樣做:

a = np.asarray([1,2,3,4]) 
a_l = a.tolist() 
a_l.insert(2,66) 
a = np.asarray(a_l) 
print a 
[1 2 66 3 4] 

但是這是非常令人費解。

是否有insert相當於numpy數組?

回答

7

您可以使用numpy.insert,但不像list.insert它返回一個新的數組,因爲NumPy中的數組具有固定的大小。

>>> import numpy as np 
>>> a = np.asarray([1,2,3,4]) 
>>> np.insert(a, 2, 66) 
array([ 1, 2, 66, 3, 4]) 
+0

這是非常直觀的,我不知道爲什麼我沒有想到的嘗試它。非常感謝@ Ashwini! – Gabriel

3

如果你只是想插入隨之指標的項目,你可以使用np.concatenate()將數組的片,用你的意圖的項目進行更優化的方式:

例如,在這種情況下,你可以做:

In [21]: np.concatenate((a[:2], [66], a[2:])) 
Out[21]: array([ 1, 2, 66, 3, 4]) 

基準(5時間快於insert):

In [19]: %timeit np.concatenate((a[:2], [66], a[2:])) 
1000000 loops, best of 3: 1.43 us per loop 

In [20]: %timeit np.insert(a, 2, 66) 
100000 loops, best of 3: 6.86 us per loop 

這裏是有更大的陣列基準(5還是時間快):

In [22]: a = np.arange(1000) 

In [23]: %timeit np.concatenate((a[:300], [66], a[300:])) 
1000000 loops, best of 3: 1.73 us per loop            

In [24]: %timeit np.insert(a, 300, 66) 
100000 loops, best of 3: 7.72 us per loop 
+0

永遠不會想到使用'np.concatenate()'更快。謝謝你Kasramvd! – Gabriel

+1

@Gabriel不客氣。這實際上是因爲'np.concatenate'只需要更少的操作來完成這個任務,而不是'insert',它會先找到索引,然後做很多檢查並創建新的。 – Kasramvd

+0

'concatenate'是已編譯的代碼,'insert'是一個相對複雜的Python函數(可以使用'np.source(np.insert)'學習)。 – hpaulj