展平大列表,一路释放

2024-04-20 00:57:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从第三方库获得的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太大了,ab不能同时放入内存,因此Python在concatenate被杀死。你知道吗

我可以在释放a元素的同时将a展平成一个连续的numpy数组吗?你知道吗


Tags: importnumpy列表byrandom数组x1x2
1条回答
网友
1楼 · 发布于 2024-04-20 00:57:11

那么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))

作为一个列表操作,它不应该影响内存使用太多,因为它只是在玩指针,而不是创建新的数组。你知道吗

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

但我不打算尝试那些可能给我带来内存满错误的数组。你知道吗

相关问题 更多 >