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

时间:2015-05-17 08:18:13

标签: 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万次迭代后继续将列表b附加到numpy数组a。

我需要输出如下所示

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

我尝试过“连接”和“vstack”,但问题是a(当为空时)和b不匹配的维度,因此代码会给出错误。

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

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

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

1 个答案:

答案 0 :(得分: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是一个链接列表,这意味着一旦出现新元素,我们就不必为整个容器重新分配内存。