【问题标题】:Appending a full array to other arrays in a for loop, similar to appending to a list (python)?在 for 循环中将完整数组附加到其他数组,类似于附加到列表(python)?
【发布时间】:2021-04-01 12:36:27
【问题描述】:

我有一个返回数组的函数,我想继续使用不同的参数调用该函数,然后在 for 循环过程中继续附加结果数组。现在,我只是定义一个列表并将新数组添加到列表中,然后将其全部堆叠在最后。这似乎效率很低。

这里是一个例子:这里我只是用 numpy random.rand 定义了一个数组来显示应该返回然后附加的数组的类型。

import numpy as np
total = 3
rows = 3
my_list = []
for i in range(total):
    output_array = np.random.rand(rows,2) # this could be variable
    my_list.append(output_array)

final_array = np.vstack(my_list)

有没有更有效的方法来做到这一点,这样我就可以直接附加到数组并在最后得到最终的完整数组?问题是我不知道循环遍历列表的预定次数,所以我不能使用连接等。

【问题讨论】:

  • 为什么您认为列表追加效率低下?您了解如何将事物添加到列表中吗?或者数组不能以同样的方式增长?
  • "现在,我只是定义一个列表并将新数组添加到列表中,然后将其全部堆叠在最后。这似乎非常低效。"不,这实际上是执行此操作的有效方式。你不能 .append 就地数组,它是 一个数组 而不是一个列表。所以numpy.ndarray.append 创建了一个新数组,但这会迫使您使用二次时间算法。您的列表方法是线性时间。
  • @Pygirl 这完全等同于他们已经在做的事情......
  • @hpaulj:不,我并没有说如果有效的话,可以追加列表。我只是提出了一个建议,让它更 Pythonic。我想不出任何改进,因为 itertools.chain 不会优化。我想这很好。
  • @Pygirl,实际上创建数组的函数可能足够复杂,以至于追加循环和列表理解之间的时间差异很小。 OP 正在寻找能够以更高效率“增长”数组的东西(没有)。

标签: python arrays list numpy


【解决方案1】:

列表旨在通过引用在具有增长空间的缓冲区中高效地追加和存储对象。

数组只能通过创建一个新数组来增长,需要一个完整的副本。最好在整个列表中完成一次。迭代连接需要更多的复制。

但请随意进行自己的时间测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多