Python中的numpy数组由多个numpy数组组成。

30

我在创建一个包含多个numpy数组的numpy数组时遇到了问题。我打算用循环来创建它:

a=np.array([])
while(...):
   ...
   b= //a numpy array generated
   a=np.append(a,b)
   ...

期望结果:

[[1,5,3], [9,10,1], ..., [4,8,6]]

实际结果:

[1,5,3,9,10,1,... 4,8,6]

这可行吗?我不知道数组的最终维度,因此无法使用固定维度进行初始化。

2个回答

64

不要在循环中向numpy数组中添加元素,这是与基本Python相比,NumPy非常擅长的操作之一。这是因为每次进行append时都会创建数据的完整副本,这将花费二次时间。

相反,只需将数组附加到Python列表中,并在最后进行转换即可;结果更简单更快速:

a = []

while ...:
    b = ... # NumPy array
    a.append(b)
a = np.asarray(a)

至于为什么您的代码不起作用: np.append 完全不像 list.append。 特别是,它在附加时不会创建新维度。 您需要使用两个维度创建初始数组,然后使用显式轴参数进行附加。


1
谢谢回复。最大的问题是我需要大约100个数组,每个数组具有非常大的维度,每个数组中有1440000个整数。使用列表会使我的程序被操作系统杀死。有什么建议吗? - Stefano Sandonà
你能猜出你会有多少元素吗?并预先分配足够大的数组?如果不能,你可能需要变得非常聪明,例如分块构建输出数组或其他方法。 - nneonneo
你还应该能够使用更大的数组进行预分配,然后在最后使用该数组的视图,一旦你知道实际存在多少元素。 - nneonneo
最后我采纳了你的建议!谢谢! - Stefano Sandonà

6
我们也可以尝试一下:
arr1 = np.arange(4)
arr2 = np.arange(5,7)
arr3 = np.arange(7,12)

array_of_arrays = np.array([arr1, arr2, arr3])
array_of_arrays
np.concatenate(array_of_arrays)

是的,关键是每个内部数组都应该是numpy而不是list,因为这样可以节省所有的空间。然后从数组列表中创建一个数组。 - Radio Controlled
从不规则嵌套序列(它是一个列表或元组,其包含长度或形状不同的列表、元组或ndarray)创建ndarray已经过时。如果您打算这样做,创建ndarray时必须指定“dtype = object”。 - Lucas Schwartz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接