Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 展平大型列表,一路取消分配_Python_Arrays_Numpy_Memory Management - Fatal编程技术网

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))
作为一个列表操作,它不应该对内存使用有太大影响,因为它只是在玩指针,而不是创建新的数组

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

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