使用不使用np.insert插入元素创建数组

时间:2016-07-29 15:57:38

标签: python arrays numpy

我有两个数组,比如说,

n = [1,2,3,4,5,6,7,8,9]
nc = [3,0,2,0,1,2,0,0,0]

nc中的非零元素是ncz = [3,2,1,2]。 n对应于nc中的非零元素的元素是p = [1,3,5,6]。我需要创建一个新的数组,其p[1:]元素在ncz.cumsum()[:-1]+1后插入,[4,6,7]之后 有没有办法在不使用np.insert或for循环的情况下执行此操作? 假设我有这样的数组对。如果不使用循环,我能为每对做同样的事情吗?生成的数组可以零填充,以使它们具有相同的形状。 结果将是[1, 2, 3, 4, 3, 5, 6, 5, 7, 6, 8, 9]

要使用np.insert执行此操作,可以执行以下操作:

n = np.array([1,2,3,4,5,6,7,8,9])
nc = np.array([3,0,2,0,1,2,0,0,0])
p1 = n[nc.nonzero()][1:]
ncz1 = nc[nc.nonzero()][:-1].cumsum()
result = np.insert(n,ncz1+1,p1)

我知道如何使用numpy insert操作执行此操作,但我需要在theano中复制它,theano没有插入操作。

1 个答案:

答案 0 :(得分:1)

由于它的通用性np.insert相当复杂(但可用于研究),但对于您的情况,使用1d数组和订单插入点,它可以简化为

np.insert(n, i, p1)

In [688]: n
Out[688]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [689]: p1
Out[689]: array([13, 15, 16])
In [690]: i
Out[690]: array([4, 6, 7], dtype=int32)

目标数组z以及该数组中的插入点:

In [691]: j=i+np.arange(len(i))
In [692]: z=np.zeros(len(n)+len(i),dtype=n.dtype)

制作一个布尔值掩码 - 在n值的位置为True,False值为p1

In [693]: ind=np.ones(z.shape,bool)
In [694]: ind[j]=False
In [695]: ind
Out[695]: 
array([ True,  True,  True,  True, False,  True,  True, False,  True,
       False,  True,  True], dtype=bool)

将值复制到右侧插槽中:

In [696]: z[ind]=n
In [697]: z[~ind]=p1    # z[j]=p1 would also work
In [698]: z
Out[698]: array([ 1,  2,  3,  4, 13,  5,  6, 15,  7, 16,  8,  9])

这是典型的返回不同大小的新数组的数组操作。制作目标,并复制适当的值。即使操作是在已编译的numpy代码中完成的(例如concatenate),也是如此。