将零插入numpy数组的最快方法

时间:2019-07-13 01:06:02

标签: python-3.x numpy

我有一个numpy数组ids = np.array([1,1,1,1,2,2,2,3,4,4]) 和另一个长度相等的vals = np.array([1,2,3,4,5,6,7,8,9,10])

数组

注意:ids数组按升序排序

我想在每个新ID的开头之前插入4个零-即 new array = np.array([0,0,0,0,1,2,3,4,0,0,0,0,5,6,7,0,0,0,0,8,0,0,0,0,9,10])

只有这样,我才能通过迭代非常慢的数组来实现这一点-我不确定如何使用insert,pad或expand_dim ...

2 个答案:

答案 0 :(得分:1)

由于您的ids递增并且是连续的,所以这并不那么困难,但是计算偏移量会有些混乱。


n = 4
m = np.flatnonzero(np.append([False], ids[:-1] != ids[1:]))

shape = vals.shape[0] + (m.shape[0]+1) * n
out = np.zeros(shape)

d = np.append([0], m) + np.full(m.shape[0] + 1, n).cumsum()
df = np.append(np.diff(d).cumsum(), [out.shape[0]])

u = tuple([slice(i, j) for i, j in zip(d, df)])

out[np.r_[u]] = vals

array([ 0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  0.,  0.,  0.,  0.,  5.,
        6.,  7.,  0.,  0.,  0.,  0.,  8.,  0.,  0.,  0.,  0.,  9., 10.])

答案 1 :(得分:0)

u可以使用np.zeros并将其附加到现有数组中,例如

newid=np.append(np.zeros((4,), dtype=int),ids)

祝你好运!