Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将元素插入numpy数组_Python_Arrays_Numpy - Fatal编程技术网

Python 将元素插入numpy数组

Python 将元素插入numpy数组,python,arrays,numpy,Python,Arrays,Numpy,列表有一种非常简单的插入元素的方法: a = [1,2,3,4] a.insert(2,66) print a [1, 2, 66, 3, 4] 对于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] 但这是非常复杂的 对于numpy数组,是否有一个insert等价物?您可以使用,但与列表不同。insert

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

a = [1,2,3,4]
a.insert(2,66)
print a
[1, 2, 66, 3, 4]
对于
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]
但这是非常复杂的

对于
numpy
数组,是否有一个
insert
等价物?

您可以使用,但与
列表不同。insert
它返回一个新数组,因为numpy中的数组具有固定大小

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

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

例如,在这种情况下,您可以执行以下操作:

In [21]: np.concatenate((a[:2], [66], a[2:]))
Out[21]: array([ 1,  2, 66,  3,  4])
基准测试(比插入代码快5倍):

这里是一个具有更大阵列的基准测试(速度仍快5倍):


要向numpy数组添加元素,可以使用“append”方法将数组和要添加的元素传递给它。例如:

将numpy导入为np
虚拟=[]
dummy=np.append(dummy,12)


这将创建一个空数组,并将数字“12”添加到其中

这非常直观,我不知道为什么我没有想到尝试它。非常感谢@Ashwini!这里有更多关于numpy.insert的信息,我从未想过使用
np.concatenate()
会更快。谢谢你,卡斯拉姆夫@加布里埃尔,不客气。这实际上是因为,
np.concatenate
执行此任务所需的操作比
insert
要少得多,后者将首先发现索引并进行大量检查并创建新的索引。
concatenate
是编译代码,
insert
是一个相对复杂的Python函数(您可以使用
np.source(np.insert)
学习)@hpaulj你的意思是C只比python快5倍?起初我认为这可能是原因,但运行时间的差异似乎就像功能上的差异一样。在尝试复制
insert
最简单的插入情况后,我认为大部分额外时间都是由于其更大的通用性。copyi的核心任务是将
a
的多个切片放入
新的
数组所需的时间与
串联
所需的时间大致相同。但它会花费更多的时间设置和操作切片元组。我认为这并不能回答OP的问题。因为OP希望在任意位置插入,而不仅仅是在最后插入。
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
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