Python 展平大型列表,一路取消分配
我有一个从第三方库获得的Python 展平大型列表,一路取消分配,python,arrays,numpy,memory-management,Python,Arrays,Numpy,Memory Management,我有一个从第三方库获得的m-by-nNumPy数组列表,例如 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太大,以至于a和b不能同时放入内存,因此Pytho
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
太大,以至于a
和b
不能同时放入内存,因此Python在连接时被杀死
我可以将a
展平为一个连续的numpy数组,同时取消分配a
的元素吗?因此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))
作为一个列表操作,它不应该对内存使用有太大影响,因为它只是在玩指针,而不是创建新的数组
可以连接块(子列表),并从列表中删除元素。但要使其有效,我们必须确保对单个数组的所有引用都已删除,否则它们不会被垃圾收集
但我不打算尝试那些可能给我带来内存满错误的数组