[英]Averaging results from a list of lists where every nth list is a reptition
所以我寫了一個 model 通過嵌套循環計算各種參數的結果。 每次計算都會返回一個包含len(columns) = 10
元素的列表,並將其添加到列表列表 ( res
) 中。
假設我計算了一些參數len(alpha) = 2
、 len(gamma) = 2
、 rep = 3
的結果,其中 rep 是我運行的重復次數。 這會以列表列表的形式產生結果,如下所示:
res = [ [elem_1, ..., elem_10], ..., [elem_1, ..., elem_10] ]
我知道len(res) = len(alpha) * len(gamma) * repetitions = 12
並且每個內部列表都有len(columns) = 10
元素。 我也知道res
中的每個第 3 個列表將是一個重復(我從我設置嵌套循環以迭代所有參數組合的方式知道,事實上我正在使用 itertools)。
我現在想對列表的結果列表進行平均。 我需要做的是獲取每個(len(res) // repetitions) = 4
th list,將它們按元素相加,然后除以重復次數 (3)。 聽起來容易做起來難,對我來說。
這是我這樣做的丑陋嘗試:
# create a list of lists of lists, where the inner list of lists are lists of the runs with the identical parameters alpha and gamma
res = [res[i::(len(res)//rep)] for i in range(len(res)//rep)]
avg_res = []
for i in res:
result = []
for j in (zip(*i)):
result.append(sum(j))
avg_res.append([i/repetitions for i in result])
print(len(result_list), avg_res)
這實際上產生了我想要的,但它肯定不是 pythonic 的方式來做到這一點。 真丑,5 分鍾后我幾乎無法理解我自己的代碼......
最pythonic的方法是什么? 提前致謝!
在某些情況下,pythonic 代碼是一種風格問題,它的習慣用法之一是使用列表理解而不是循環,因此編寫result = [sum(j) for j in (zip(*i))]
比迭代zip(*i)
。
另一方面,嵌套列表理解看起來更復雜,所以不要這樣做
avg_res = [[i/repetitions for i in [sum(j) for j in (zip(*j))]] for j in res]
你可以寫:
res = [res[i::(len(res)//rep)] for i in range(len(res)//rep)]
avg_res = []
for i in res:
result = [sum(j) for j in (zip(*i))]
avg_res.append([i/repetitions for i in result])
print(len(result_list), avg_res)
一般編程中的另一個習語(特別是在 python 中)是使用函數和變量名命名操作,以使代碼更具可讀性:
def sum_columns(list_of_rows):
return [sum(col) for col in (zip(*list_of_rows))]
def align_alpha_and_gamma(res):
return [res[i::(len(res)//rep)] for i in range(len(res)//rep)]
aligned_lists = align_alpha_and_gamma(res)
avg_res = []
for aligned_list in aligned_lists:
sums_of_column= sum_columns(aligned_list)
avg_res.append([sum_of_column/repetitions for sum_of_column in sums_of_column])
print(len(result_list), avg_res)
當然你可以根據你想在代碼中做什么來選擇更好的名字。
按照您的說明進行操作有點困難,但正如我發現的那樣,您嘗試對第 N 個列表中的所有元素求和並將其除以重復次數。
res = [list(range(i,i+10)) for i in range(10)]
N = 4
repetitions = 3
average_of_Nth_lists = sum([num for iter,item in enumerate(res) for num in item if iter%N==0])/repetitions
print(average_of_Nth_lists)
output:
85.0
結果解釋:等於sum(0-9)+sum(4-13)+sum(8-17) = 255
--> 255/3=85.0
創建res
作為列表列表,遍歷第 N 個列表(在我的例子中,1,5,9 你可以將它轉換為 4,8 等等,如果你想要的話,找出代碼中的位置或尋求幫助如果你不明白),將它們加起來並除以repetitions
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.