压扁大量列表,沿途解除分配

时间:2017-11-24 13:15:33

标签: python arrays numpy memory-management

我列出了从第三方库获取的m - by - n NumPy数组列表,例如,

import numpy

x0 = numpy.random.rand(1000, 1000)  # x_i likewise
a =  [[x0], [x1, x2], [x3, x4, x5]]   # and more

我现在需要扁平化这种结构,例如,

b = numpy.concatenate(a)
# b =  [x0, x1, x2, x3, x4, x5]

数组x非常大,以至于ab同时不适合内存,所以Python在{{1 }}

我可以将concatenate展平成一个连续的numpy数组,同时在途中释放a的元素吗?

1 个答案:

答案 0 :(得分:0)

所以a是数组列表的列表,其中所有数组都具有相同的形状?

concatenate获取一个数组列表,并将它们连接到所需的轴上。它被编译,因此很难说它正在对列表列表等做什么。这个测试显示它的行为好像列表列表是平面列表。但我不能说它是否使列表变平或嵌套连接。

In [339]: x0=np.ones((3,4),int)
In [340]: a=[[x0],[x0,x0],[x0,x0,x0]]
In [341]: np.concatenate(a)
In [342]: _.shape
Out[342]: (6, 3, 4)

嵌套列表可以使用itertools

展平
In [343]: import itertools
In [344]: b=list(itertools.chain(*a))

作为一个列表操作,它不应该影响内存使用,因为它只是在玩指针而不是制作新的数组。

可以连接块(子列表),并从列表中删除元素。但为了使其有效,我们必须确保所有对单个数组的引用都消失了,否则它们将不会被垃圾回收。

但我不会尝试可能会给我带来内存完全错误的数组。