使用多个迭代的多个数字填充numpy数组的快速方法

时间:2014-08-29 02:31:16

标签: arrays python-2.7 numpy

我需要填充一个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))

2 个答案:

答案 0 :(得分:3)

它几乎比你的记忆预分配快了10倍(比约什的解决方案更快)。

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

如果您在开始时有足够的信息来调整数组大小,为什么还要使用中间存储? (np.empty是一种快速调整数组大小而不实际设置任何值的方法)

答案 1 :(得分:1)

此代码执行相同的操作,但在我的机器上需要3 ms vs 200 ms:

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),因此您应该小心。