我有一个numpy的阵列,我可以使用追加,像这样的项目只是附加到它:最佳的方式追加到numpy的阵列
numpy.append(myarray, 1)
在这种情况下我刚所附整数1
。
但这是追加到数组最快的方法?我有一个很长的阵列,数以万计。
或者索引数组并直接赋值会更好吗? 像这样:
myarray[123] = 1
我有一个numpy的阵列,我可以使用追加,像这样的项目只是附加到它:最佳的方式追加到numpy的阵列
numpy.append(myarray, 1)
在这种情况下我刚所附整数1
。
但这是追加到数组最快的方法?我有一个很长的阵列,数以万计。
或者索引数组并直接赋值会更好吗? 像这样:
myarray[123] = 1
追加到numpy的阵列是非常低效的。这是因为解释器需要在每一步中为整个阵列查找和分配内存。根据应用情况,有更好的策略。
如果您事先知道长度,最好使用np.ones
,np.zeros
或np.empty
等函数预先分配阵列。
desired_length = 500
results = np.empty(desired_length)
for i in range(desired_length):
results[i] = i**2
如果您不知道长度,那么将结果保留在常规列表中并将其转换为数组可能会更有效。
results = []
while condition:
a = do_stuff()
results.append(a)
results = np.array(results)
这里是我的计算机上的某些时刻。
def pre_allocate():
results = np.empty(5000)
for i in range(5000):
results[i] = i**2
return results
def list_append():
results = []
for i in range(5000):
results.append(i**2)
return np.array(results)
def numpy_append():
results = np.array([])
for i in range(5000):
np.append(results, i**2)
return results
%timeit pre_allocate()
# 100 loops, best of 3: 2.42 ms per loop
%timeit list_append()
# 100 loops, best of 3: 2.5 ms per loop
%timeit numpy_append()
# 10 loops, best of 3: 48.4 ms per loop
所以你可以看到,预先分配和使用列表,然后转换更快。
如果您在运行结束时知道数组的大小,那么预先分配适当大小的数组然后设置值会快得多。如果您确实需要即时添加,最好尽量不要一次完成这一个元素,而应尽可能多地添加以避免重复生成多个副本。您可能还需要对np.append
,np.hstack
,np.concatenate
的时间差异进行分析。等等。