我有两个数组,比如说,
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没有插入操作。
答案 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
),也是如此。