展平大量列表,沿途解除分配
Posted
技术标签:
【中文标题】展平大量列表,沿途解除分配【英文标题】:flatten large list of lists, deallocate along the way 【发布时间】:2017-11-24 13:15:33 【问题描述】:我有一个 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 在concatenate
上被淘汰了。
我可以将a
展平成一个连续的numpy 数组,同时释放a
的元素吗?
【问题讨论】:
【参考方案1】:所以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))
作为一个列表操作,它不应该对内存使用产生太大影响,因为它只是在玩指针,而不是创建新数组。
可以连接块(子列表),并从列表中删除元素。但是为了使这有效,我们必须确保对单个数组的所有引用都消失了,否则它们不会被垃圾收集。
但我不打算尝试可能给我内存满错误的数组。
【讨论】:
以上是关于展平大量列表,沿途解除分配的主要内容,如果未能解决你的问题,请参考以下文章