我列出了从第三方库获取的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在{{1 }}
我可以将concatenate
展平成一个连续的numpy数组,同时在途中释放a
的元素吗?
答案 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))
作为一个列表操作,它不应该影响内存使用,因为它只是在玩指针而不是制作新的数组。
可以连接块(子列表),并从列表中删除元素。但为了使其有效,我们必须确保所有对单个数组的引用都消失了,否则它们将不会被垃圾回收。
但我不会尝试可能会给我带来内存完全错误的数组。