Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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 如何使用np.concatenate()在numpy数组中插入多个元素?_Python_Arrays_Numpy - Fatal编程技术网

Python 如何使用np.concatenate()在numpy数组中插入多个元素?

Python 如何使用np.concatenate()在numpy数组中插入多个元素?,python,arrays,numpy,Python,Arrays,Numpy,已经是在numpy数组中插入一个元素的答案,其中np.concatenate()优于np.insert()(np.concatenate()比np.insert()花费的时间更少)。但我无法使用它在多个位置插入元素。这里有一个例子-- 如何将np.concatenate()用于相同的对象 In [178]: cell = np.array([1, 4, 4, 5, 5, 2, 5, 1, 1, 5]) In [179]: place = np.argwhere(cell == np.amax(c

已经是在
numpy
数组中插入一个元素的答案,其中
np.concatenate()
优于
np.insert()
np.concatenate()
np.insert()
花费的时间更少)。但我无法使用它在多个位置插入元素。这里有一个例子--

如何将np.concatenate()用于相同的对象

In [178]: cell = np.array([1, 4, 4, 5, 5, 2, 5, 1, 1, 5])
In [179]: place = np.argwhere(cell == np.amax(cell)).flatten().tolist()
In [180]: place
Out[180]: [3, 4, 6, 9]
In [181]: np.insert(cell, place, 0)
Out[181]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5])
In [182]: np.concatenate([cell[:3],[0],cell[3:4],[0],cell[4:6],[0],cell[6:9],[0] ,cell[9:]])
Out[182]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5])
构造concatante列表可以通过在
位置
值上的某种列表迭代来概括。细节留给读者

insert
,通过多次插入,使用了一种
mask
方法,我们可以对其进行反向工程:

它在哪里插入了0

In [193]: res = np.insert(cell, place, 0)
In [194]: np.where(res==0)
Out[194]: (array([ 3,  5,  8, 12], dtype=int32),)
这与将0,1,2,3添加到位置相同:

In [195]: np.arange(n)+place
Out[195]: array([ 3,  5,  8, 12])
制作目标阵列和遮罩阵列:

In [196]: out = np.zeros(len(cell)+n, dtype=cell.dtype)
In [197]: mask = np.ones(len(out), dtype=bool)
使用掩码定义插入原始值的位置

In [198]: mask[Out[195]]=False
In [199]: out[mask] = cell
In [200]: out
Out[200]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5])
因为插入值是0,所以我们不需要做更多的事情

我在前面的回答中建议,
concatenate
比insert更快,因为
insert
更通用,设置起来需要更多时间。情况也可能如此。但我不希望在时间上有什么进步


广义连接

In [235]: catlist = [cell[:place[0]],[0]]
In [236]: for i in range(n-1):
     ...:     catlist.append(cell[place[i]:place[i+1]])
     ...:     catlist.append([0])
     ...:     
In [237]: catlist.append(cell[place[-1]:])
In [238]: np.concatenate(catlist)
Out[238]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5])

对于该示例,
place
为空。该命令对
place
有什么作用?@Divakar my bad。现在我已经更正了。请查看
np.insert
(例如,文档上的源代码)。它根据插入点的数量使用不同的策略。虽然可能性很多,但基本原则很简单。谢谢。这是一种很好的方法,但问题是我必须处理10^18个元素,这就是为什么我尝试实现
串联()
,否则我可以使用
插入()
。如果您有比
insert()
花费更少时间的更好的解决方案,它将对我非常有帮助。我已经尝试了
concatenate()。再次感谢。如果
单元格
位置
大,我希望
串联
方法(请参阅我的上一次编辑)会更快,因为它适用于
单元格的大片段
。但是如果切片很小且数量很多,那么由
insert
完成的蒙面副本可能会更快。我已经完全尝试了您在上次编辑中所说的内容。正如你所说,这里的地方不小。因此,
insert
将对我有所帮助。非常感谢。
In [235]: catlist = [cell[:place[0]],[0]]
In [236]: for i in range(n-1):
     ...:     catlist.append(cell[place[i]:place[i+1]])
     ...:     catlist.append([0])
     ...:     
In [237]: catlist.append(cell[place[-1]:])
In [238]: np.concatenate(catlist)
Out[238]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5])