numpy数组追加的最佳方法

12

我有一个numpy数组,我可以使用"append"简单地向其中添加一个项目,如下所示:

numpy.append(myarray, 1)

在这种情况下,我只是添加了整数1

但是这是否是将元素附加到数组的最快方法?我有一个非常长的数组,它有成千上万个元素。

还是直接索引数组并直接赋值更好?像这样:

myarray[123] = 1

这个回答解决了你的问题吗?快速增长numpy数值数组的最快方法 - user202729
2个回答

29

向NumPy数组添加元素非常低效。这是因为解释器需要在每个步骤中找到并为整个数组分配内存。根据应用程序,有更好的策略。

如果您预先知道长度,最好使用像np.onesnp.zerosnp.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

因此,您可以看到预分配和先使用列表再转换两种方法都更快。


2
如果您在运行结束时知道数组的大小,那么预先分配一个适当大小的数组并设置值将会更快。如果您需要动态添加元素,最好尝试一次性添加多个元素,而不是一个一个地添加,以避免反复生成许多副本。您还可以对np.appendnp.hstacknp.concatenate等函数的时间差异进行一些分析。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接