numpy 如何在迭代中使用np.insert?

tvmytwxo  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(91)

我想把一个数组插入到另一个数组的某些特定位置。例如,假设你有

import numpy as np

pos = np.array([1, 3, 4])
arr = np.array([0, 1, 2, 3, 4, 5])
vals = np.array([-1,-1])

我想把vals插入到arrpos指定的位置,这样最后就有了result = [0,-1,-1,1,2, -1,-1, 3,-1,-1,4,5]
也就是说,对于pos中的所有i[result[i], result[i+1]]应该等于val
我尝试了以下循环:

for ii in pos:
    arr = np.insert(arr, ii, vals)

但是它不起作用,因为arr的大小在每次迭代时都在增加。

baubqpgj

baubqpgj1#

由于vals是固定的,因此可以解释大小的变化:

arr = np.array([0, 1, 2, 3, 4, 5])

for ii in pos + np.arange(len(pos))*len(vals):
    arr = np.insert(arr, ii, vals)

或者:

arr = np.array([0, 1, 2, 3, 4, 5])

for n, ii in enumerate(pos):
    arr = np.insert(arr, ii+n*len(vals), vals)

输出量:

array([ 0, -1, -1,  1,  2, -1, -1,  3, -1, -1,  4,  5])
ux6nzvsh

ux6nzvsh2#

In [130]: pos = np.array([1, 3, 4])
     ...: arr = np.array([0, 1, 2, 3, 4, 5])
     ...: vals = np.array([-10,10]) # more interesting

posvals扩展到匹配长度:

In [131]: pos.repeat(2)
Out[131]: array([1, 1, 3, 3, 4, 4])    
In [133]: np.tile(vals, 3)
Out[133]: array([-10,  10, -10,  10, -10,  10])

In [134]: np.insert(arr, pos.repeat(2), np.tile(vals, 3))
Out[134]: array([  0, -10,  10,   1,   2, -10,  10,   3, -10,  10,   4,   5])

insert每次被调用时都会创建一个新数组,其中包含来自arrvals的所有附带副本。对于重复调用,您必须考虑arr的增长。
请注意,insert考虑了这种增长。如果我把扩展的pos加上[0,1,2...],我可以索引结果中的插入:

In [135]: Out[134][Out[131]+np.arange(6)]
Out[135]: array([-10,  10, -10,  10, -10,  10])

类似地,我可以创建一个result=np.zeros(12),找出arr元素所属的位置,并将vals元素分配给剩余的插槽。索引数学需要一些照顾,但不是花哨或耗时。insert主要是一个方便的函数,而不是一个特殊的编译函数。
一种方法是为我们想要插入值的位置创建一个布尔掩码:

In [151]: mask = np.zeros(12,bool)    
In [152]: mask[pos.repeat(2)+np.arange(6)]=True    
In [153]: mask
Out[153]: 
array([False,  True,  True, False, False,  True,  True, False,  True,
        True, False, False])

创建一个目标数组:

In [154]: result = np.zeros(12, int)

指定原始值和新值:

In [155]: result[~mask] = arr    
In [156]: result[mask] = np.tile(vals,3)

In [157]: result
Out[157]: array([  0, -10,  10,   1,   2, -10,  10,   3, -10,  10,   4,   5])

相关问题