2014-02-13 33 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