展平大量列表,沿途解除分配

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 太大了,以至于ab 不能同时放入内存中,所以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))

作为一个列表操作,它不应该对内存使用产生太大影响,因为它只是在玩指针,而不是创建新数组。

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

但我不打算尝试可能给我内存满错误的数组。

【讨论】:

以上是关于展平大量列表,沿途解除分配的主要内容,如果未能解决你的问题,请参考以下文章

如何正确分配和解除分配向量图

如何使用 C++ 中的指针动态分配和解除分配二维数组?

许多固定长度的最快分配和解除分配?

C:指向结构指针数组的指针(分配/解除分配问题)

删除、释放还是解除分配?

AFHTTPSessionManager 未解除分配