将元素插入到numpy数组中

Gab*_*iel 10 python arrays numpy

列表有一个非常简单的方法来插入元素:

a = [1,2,3,4]
a.insert(2,66)
print a
[1, 2, 66, 3, 4]
Run Code Online (Sandbox Code Playgroud)

对于numpy我可以做的数组:

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]
Run Code Online (Sandbox Code Playgroud)

但这非常令人费解.

是否有数组的insert等价物numpy

Ash*_*ary 17

您可以使用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])
Run Code Online (Sandbox Code Playgroud)


Kas*_*mvd 7

如果您只想在后续索引中插入项目,可以使用更优化的方法np.concatenate()将数组的切片与预期项目连接起来:

例如,在这种情况下,你可以这样做:

In [21]: np.concatenate((a[:2], [66], a[2:]))
Out[21]: array([ 1,  2, 66,  3,  4])
Run Code Online (Sandbox Code Playgroud)

基准(比时间快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
Run Code Online (Sandbox Code Playgroud)

这是一个更大阵列的基准测试(仍然快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
Run Code Online (Sandbox Code Playgroud)

  • 从未想过使用 `np.concatenate()` 会更快。谢谢你! (2认同)