【发布时间】:2016-03-02 01:08:17
【问题描述】:
我有一个数组列表,例如:
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])]
【问题讨论】:
-
您需要同时将所有值保存在内存中吗?您可能希望使用生成器来懒惰地处理这些值,以便您可以尽快摆脱不再需要的数据部分。
-
不,我不需要同时将它们全部存储在内存中。一次只有每个输入数组和输出值
-
你的arr怎么样了?其中最大的数组是什么?在 32GB 的机器上内存不足似乎很奇怪
-
我从一个简单的一维数组 (A) 开始,其中包含 432 个值。我还有另外两个形状为 (40000, 1) 的数组,B 和 C。我想使用 B 和 C 中的每个值来切片 A。类似于:A[B:C]。由于切片只接受整数而不是列表,所以我使用“for”循环来遍历 B 的长度,并附加 A[B[i]:C[i]] 并将结果附加到 arr。因此,arr 中的每个数组都是我开始使用的原始数组的子集
-
如果每个切片都独立于其他切片进行处理,您应该跳过构建包含所有切片的大列表,并在创建后立即对每个切片进行处理(例如
for b, c in zip(B, C):out = 3*A[b:c]-2-- 大概你会在循环中使用out做更多的事情,但我不知道是什么)。
标签: python arrays numpy memory