我编写了以下代码来计算列表列表的所有排列之间获得的总和的平均值:import numpy as npimport itertoolsr = 13c = 5a = np.arange(r*c).reshape(r, c)a = list(itertools.product(*a))res = sum([sum(e) for e in a])/len(a)代码崩溃,因为 r 似乎有点太大,itertools/python 无法处理它。有没有其他方法可以在不让代码崩溃的情况下计算res ?
1 回答
MM们
TA贡献1886条经验 获得超2个赞
您不必要地首先收集products
,然后收集个人sums
,当lists
您也可以迭代迭代器时。您也不需要len
列表,因为您可以直接计算产品的数量。
res = sum(sum(e) for e in itertools.product(*a))/c**r
这将消耗更少的内存,这可能会防止您的计算机死机或崩溃。然而,对于r=13
和c=5
,这仍然意味着测试c**r = 1,220,703,125
组合,这对于 Python 来说可能太多了。
但是,由于您获取的是所有产品,因此每个元素在所有产品中出现的次数相同,因此您根本不必实际计算和迭代产品。相反,您可以像这样直接计算产品的平均总和:
res = sum(sum(a)) // c # here, a is the numpy array, not the product iterator
(这是针对所有元素数量相同的列表;如果列表大小不同,公式会稍微复杂一些,但仍然可以直接计算,无需任何循环。)
添加回答
举报
0/150
提交
取消