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

时间:2017-07-17 05:37:47

标签: python arrays numpy

Here已经是在numpy数组中插入一个元素的答案,其中np.concatenate()支配np.insert() np.concatenate()所占用的时间少于np.insert() })。但我无法使用它在多个位置插入元素。这是一个例子 -

cell = np.array([1, 4, 4, 5, 5, 2, 5, 1, 1, 5])
place = np.argwhere(cell == np.amax(cell)).flatten().tolist()
cell = np.insert(cell, place, 0)

如何使用np.concatenate()?

1 个答案:

答案 0 :(得分:0)

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列表可以通过place值的某种列表迭代来推广。详细信息留待读者阅读。

带有多次插入的

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更通用,需要更多时间来设置。情况也许如此。但我不希望时间有所改善。

广义连接

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])