Arrays 使用多个数字的多次迭代快速填充numpy数组

Arrays 使用多个数字的多次迭代快速填充numpy数组,arrays,python-2.7,numpy,Arrays,Python 2.7,Numpy,我需要填充numpy数组,执行速度对我很重要。数组将使用一个字典,该字典将指定我需要多少数组值(键值)的实例(索引键值) 下面的脚本是我的尝试,测试显示运行它需要0.14秒,但是如果我删除了hstack,它将在0.004秒内运行。所以我得出结论,是数组的串联花费了时间。有什么更好的方法 注意,下面的字典只是一个测试用例,通常我会有大约100个不同的值,每个值会重复大约10000次 td = {} for ii in range(100): td[ii] = 10000+ii a = np

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

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

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

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))

此代码执行相同的操作,但在我的机器上需要3毫秒而不是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
),因此您应该小心。

此代码做同样的事情,但在我的机器上需要3毫秒而不是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
),因此您应该小心。

完全预先分配内存几乎比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
是一种在不设置任何值的情况下快速调整数组大小的方法)

只需完全预先分配内存,几乎比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
是一种快速调整数组大小的方法,无需实际设置任何值)