【问题标题】:Fast way to populate numpy array with multiple iterations of multiple numbers使用多个数字的多次迭代填充 numpy 数组的快速方法
【发布时间】:2014-08-29 02:31:16
【问题描述】:

我需要填充一个 numpy 数组,执行速度对我来说很重要。该数组将使用一个字典,该字典将指定我需要多少个数组值(键值)的实例(索引键值)。

下面的脚本是我的尝试,测试显示它需要 0.14 秒才能运行,但如果我删除 hstack,它会在 0.004 秒内运行。所以我得出结论,这是花费时间的数组的连接。有什么更好的方法?

请注意,下面的字典只是一个测试用例,通常我会有大约 100 个不同的值,每个值将重复大约 10,000 次。

td = {}
for ii in range(100):
    td[ii] = 10000+ii
a = np.ones(0)
for aa in td:
    a = np.hstack((a,np.ones(td[aa])*aa))

【问题讨论】:

    标签: arrays python-2.7 numpy


    【解决方案1】:

    完全预分配内存几乎比 Josh 的解决方案快 10 倍。

    a = np.empty((sum(td.values(),)))
    i=0
    for k,v in td.iteritems():
        a[i:i+v]=k
        i +=v
    

    当您在开始时有足够的信息来调整数组大小时,为什么还要搞乱中间存储? (np.empty 是一种无需实际设置任何值即可快速调整数组大小的方法)

    【讨论】:

      【解决方案2】:

      这段代码做同样的事情,但在我的机器上需要 3 毫秒 vs 200 毫秒:

      td = {}
      for ii in range(100):
          td[ii] = 10000+ii
      
      a = np.hstack([np.ones(td[aa])*aa for aa in td])
      

      它在数组列表上调用一次np.hstack,而不是重复加入。另外,请注意,您遍历字典的顺序不能保证与插入顺序相同(如果需要,请使用 OrderedDict),因此您应该小心。

      【讨论】:

        猜你喜欢
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 2013-11-18
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        相关资源
        最近更新 更多