簡體   English   中英

對列表列表的結果進行平均,其中每個第 n 個列表都是一個重復項

[英]Averaging results from a list of lists where every nth list is a reptition

所以我寫了一個 model 通過嵌套循環計算各種參數的結果。 每次計算都會返回一個包含len(columns) = 10元素的列表,並將其添加到列表列表 ( res ) 中。

假設我計算了一些參數len(alpha) = 2len(gamma) = 2rep = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM