【问题标题】:Quickest way to insert zeros into numpy array将零插入numpy数组的最快方法
【发布时间】:2019-07-13 12:33:09
【问题描述】:

我有一个 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 来做到这一点......

【问题讨论】:

  • id 是否总是按递增顺序连续排列?
  • 是的 - 抱歉,我没有明确指出这一点
  • 制作一个足够大的零数组,并将您的数组复制到正确的位置。
  • 嘿@hpaulj - 正要尝试这种方法

标签: python-3.x numpy


【解决方案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.])

【讨论】:

  • 谢谢你,这很好用 - 我最终产生了一个类似的解决方案,但使用 pd.groupby 来计算新指数......你分享的更快
【解决方案2】:

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

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

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2023-04-04
    • 2012-02-27
    • 2017-01-26
    相关资源
    最近更新 更多