【问题标题】:How do I append a list to an empty numpy array如何将列表附加到空的 numpy 数组
【发布时间】:2015-05-17 08:18:12
【问题描述】:

我有一个功能,每次迭代都会获取元素并将其附加到列表中。在一定数量的迭代(比如 100 万次)结束时,我想将列表附加到一个 numpy 数组,然后清空列表并继续该过程。

我已将一个空的 numpy 数组声明为

a= np.array([], dtype="int32")

b =[1,2,3,4] is my list for first 1 million iteration, 

b =[5,4,3,2] is the list for second 1 million iteration

如何在每 100 万次迭代后继续将列表 b 附加到 numpy 数组 a 中。

我需要如下所示的输出

array([[1, 2, 3, 4],
   [5, 4, 3, 2]])

我已经尝试过 "concatenate" 和 "vstack" ,但问题是 a(当为空时)和 b 的维度不匹配,所以代码给出了错误。

列表将高达 100 万,因此需要一种经济高效的方法来处理追加。我也可以为每次迭代“vstack”元素,但是每次我 vstack 时都会加载巨大的列表,这不符合成本效益。我尝试了下面的代码,它工作得很好,但我想避免在每次迭代时进行检查。

if any(a):
    a=np.vstack((a,b))
else:
    a=np.append(a,b, axis=0)

有什么方法可以在不执行检查的情况下将列表附加到 numpy 数组。

【问题讨论】:

  • 你可能会觉得这很有趣:stackoverflow.com/a/5068182/1716866.
  • 请注意,附加到 numpy 数组永远不会有效。 Numpy 数组的大小不能动态增长,因此每次连接都会创建一个全新的数组。如果您知道最大迭代次数,您可以首先初始化整个矩阵并逐行填充它。一个稍微难看的方法是存储一个 numpy 数组列表并在最后创建大数组。
  • 如果你想追加到一个空数组,你必须指定它的维度。例如,np.empty((0,4))

标签: python arrays list numpy


【解决方案1】:

我建议不要附加到数组,因为这样效率很低。相反,您可以使用deque 来收集列表,并仅在需要时从中创建一个数组。这是一个例子:

from collections import deque
import numpy as np

lists = deque()
for i in range(1, 13, 4):
     lists.append(range(i, i + 4))

result = np.array(lists)

现在我们有

>>> result
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

deque 是一个链表,这意味着一旦出现新元素,我们就不必为整个容器重新分配内存。

【讨论】:

    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2022-10-15
    • 2018-08-24
    • 2013-03-22
    • 2021-10-12
    相关资源
    最近更新 更多