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
做更多的事情,但我不知道是什么)。