【问题标题】:Optimal way to append to numpy array追加到numpy数组的最佳方法
【发布时间】:2014-10-28 06:38:47
【问题描述】:

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

numpy.append(myarray, 1)

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

但这是追加到数组的最快方法吗?我有一个很长的数组,数以万计。

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

myarray[123] = 1

【问题讨论】:

标签: python arrays optimization numpy


【解决方案1】:

附加到 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 的时间差异进行一些分析。等等

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2014-07-16
      • 2015-02-21
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      相关资源
      最近更新 更多