我需要填充一个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))
答案 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
),因此您应该小心。