我編寫了以下代碼來計算列表列表的所有排列之間獲得的總和的平均值: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
提交
取消