Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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 - Fatal编程技术网

Python 迭代列表或数组时出现内存问题

Python 迭代列表或数组时出现内存问题,python,arrays,numpy,memory,Python,Arrays,Numpy,Memory,我有一个数组列表,以便: arr = [array([1,2,3,4,5]), array([1,4,6,7]) .......] 其中包含40000个阵列。理想情况下,我希望将其作为2d numpy数组,但我不能保证所有数组的长度都相同 我想对列表中的所有值执行一些基本操作,例如: out = (3*arr)+2 但是我很快就用完了内存(在32GB的机器上),所以它显然非常低效。我曾尝试迭代列表,并将结果附加到新列表中,但这同样效率低下 有没有一种有效的方法来实现这一点 --------

我有一个数组列表,以便:

arr = [array([1,2,3,4,5]), array([1,4,6,7]) .......] 
其中包含40000个阵列。理想情况下,我希望将其作为2d numpy数组,但我不能保证所有数组的长度都相同

我想对列表中的所有值执行一些基本操作,例如:

out = (3*arr)+2
但是我很快就用完了内存(在32GB的机器上),所以它显然非常低效。我曾尝试迭代列表,并将结果附加到新列表中,但这同样效率低下

有没有一种有效的方法来实现这一点

---------------编辑--------------

arr看起来像:

[array([ 451.481649,  456.490319,  461.498989,  466.507659,  471.516329,
    476.524999,  481.533669,  486.542339,  491.551009,  496.559679,
    501.568349,  506.577019,  511.585689,  516.594359,  521.603029,
    526.611699,  531.62037 ,  536.62904 ,  541.63771 ,  546.64638 ,
    551.65505 ,  556.66372 ,  561.67239 ,  566.68106 ,  571.68973 ,
    576.6984  ,  581.70707 ,  586.71574 ,  591.72441 ,  596.73308 ,
    601.74175 ,  606.75042 ,  611.75909 ,  616.76776 ,  621.77643 ,
    626.7851  ,  631.79377 ,  636.80244 ,  641.811111,  646.819781,
    651.828451,  656.837121,  661.845791,  666.854461,  671.863131]),
array([ 451.481649,  456.490319,  461.498989,  466.507659,  471.516329,
    476.524999,  481.533669,  486.542339,  491.551009,  496.559679,
    501.568349,  506.577019,  511.585689,  516.594359,  521.603029,
    526.611699,  531.62037 ,  536.62904 ,  541.63771 ,  546.64638 ,
    551.65505 ,  556.66372 ,  561.67239 ,  566.68106 ,  571.68973 ,
    576.6984  ,  581.70707 ,  586.71574 ,  591.72441 ,  596.73308 ,
    601.74175 ,  606.75042 ,  611.75909 ,  616.76776 ,  621.77643 ,
    626.7851  ,  631.79377 ,  636.80244 ,  641.811111,  646.819781,
    651.828451,  656.837121,  661.845791,  666.854461,  671.863131]),
array([ 451.481649,  456.490319,  461.498989,  466.507659,  471.516329,
    476.524999,  481.533669,  486.542339,  491.551009,  496.559679,
    501.568349,  506.577019,  511.585689,  516.594359,  521.603029,
    526.611699,  531.62037 ,  536.62904 ,  541.63771 ,  546.64638 ,
    551.65505 ,  556.66372 ,  561.67239 ,  566.68106 ,  571.68973 ,
    576.6984  ,  581.70707 ,  586.71574 ,  591.72441 ,  596.73308 ,
    601.74175 ,  606.75042 ,  611.75909 ,  616.76776 ,  621.77643 ,
    626.7851  ,  631.79377 ,  636.80244 ,  641.811111,  646.819781,
    651.828451,  656.837121,  661.845791,  666.854461,  671.863131])]

如果你真的像你写的那样做,你很可能会遇到内存问题,因为

out = (3*arr)+2
复制阵列3次,然后尝试附加到阵列。该常数越大,数组越大,因此内存爆炸

要在没有内存问题的情况下实现所需功能,请使用

out = [[3*x + 2 for x in arr_list] for arr_list in arr]

如果你真的像你写的那样做,你很可能会遇到内存问题,因为

out = (3*arr)+2
复制阵列3次,然后尝试附加到阵列。该常数越大,数组越大,因此内存爆炸

要在没有内存问题的情况下实现所需功能,请使用

out = [[3*x + 2 for x in arr_list] for arr_list in arr]

是否需要同时在内存中保留所有值?您可能希望使用生成器惰性地处理这些值,以便尽快删除不再需要的部分数据。不,我不需要同时将它们全部存储在内存中。一次只处理每个输入数组和输出值如何获得arr?其中最大的阵列是什么?在32GB的机器上内存不足似乎很奇怪我从一个包含432个值的简单1d数组(a)开始。我还有另外两个数组,它们的形状是(40000,1),B和C。我想使用B和C中的每个值来切片A。类似于:A[B:C]。由于切片只接受整数而不接受列表,我使用“for”循环在B的长度上迭代,并附加a[B[I]:C[I]]并将结果附加到arr。因此,如果每个切片独立于其他切片进行处理,则arr中的每个数组都是我开始使用的原始数组的子集,您应该跳过构建一个包含所有切片的大列表,在创建之后立即对每个切片进行处理(例如,b的
,zip中的c(b,c):out=3*a[b:c]-2
——大概您会在循环中使用
out
做更多的事情,但我不知道是什么).是否需要同时在内存中保留所有值?您可能希望使用生成器惰性地处理这些值,以便尽快删除不再需要的部分数据。不,我不需要同时将它们全部存储在内存中。一次只处理每个输入数组和输出值如何获得arr?其中最大的阵列是什么?在32GB的机器上内存不足似乎很奇怪我从一个包含432个值的简单1d数组(a)开始。我还有另外两个数组,它们的形状是(40000,1),B和C。我想使用B和C中的每个值来切片A。类似于:A[B:C]。由于切片只接受整数而不接受列表,我使用“for”循环在B的长度上迭代,并附加a[B[I]:C[I]]并将结果附加到arr。因此,如果每个切片独立于其他切片进行处理,则arr中的每个数组都是我开始使用的原始数组的子集,您应该跳过构建一个包含所有切片的大列表,在创建之后立即对每个切片进行处理(例如,b的
,zip中的c(b,c):out=3*a[b:c]-2
——大概您会在循环中使用
out
做更多的事情,但我不知道是什么)。