Python 如何将列表附加到空numpy数组

Python 如何将列表附加到空numpy数组,python,arrays,list,numpy,Python,Arrays,List,Numpy,我有一个功能,每次迭代都会获取元素并将其附加到列表中。在一定次数的迭代结束时(比如说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万

我有一个功能,每次迭代都会获取元素并将其附加到列表中。在一定次数的迭代结束时(比如说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

if any(a):
    a=np.vstack((a,b))
else:
    a=np.append(a,b, axis=0)
我需要一个如下所示的输出

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数组

我建议不要附加到数组中,因为这样会非常低效。相反,您可以使用
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
是一个链表,这意味着一旦出现新元素,我们不必为整个容器重新分配内存。

您可能会发现这很有趣:。请注意,附加到numpy数组从来都没有效率。Numpy数组的大小不能动态增长,因此每次连接都会创建一个全新的数组。如果您知道最大迭代次数,您可以首先初始化整个矩阵,然后逐行填充它。一种稍微丑陋的方法是存储一个numpy数组列表,并最终创建一个大数组。如果要附加到一个空数组,则必须指定其维度。例如,
np.empty((0,4))