簡體   English   中英

允許包含不同長度列表的列表的逐元素均值

[英]Allowing element-wise mean of a list containing different lengths lists

我有一個代碼,其中有一個列表X追加了多個不同長度的列表。 例如:運行后X的最終值可以如下所示:

X = [[0.6904056370258331, 0.6844439387321473, 0.668782365322113], 
     [0.7253621816635132, 0.6941058218479157, 0.6929935097694397, 0.6919471859931946, 0.6905447959899902]]

正如可以看到, X[0]是長度= 3,而X[1]是長度= 5我想要做的逐元素(列方向)的均值的X ,以產生一個單一的1D平均X 如果我嘗試np.mean(X, axis=0)則會引起錯誤,因為X[0]X[1]的長度不同。 有沒有一種方法可以實現我想要的結果,即X一維均值?

謝謝,

要進行“列”計算,我們需要將其更改為列列表。

In [475]: X = [[0.6904056370258331, 0.6844439387321473, 0.668782365322113],  
     ...:      [0.7253621816635132, 0.6941058218479157, 0.6929935097694397, 0.6919471859931946, 0.6905447959899902]] 

zip_longest是用於“轉置”不規則列表的便捷工具:

In [476]: import itertools                                                                                   
In [477]: T = list(itertools.zip_longest(*X, fillvalue=np.nan))                                              
In [478]: T                                                                                                  
Out[478]: 
[(0.6904056370258331, 0.7253621816635132),
 (0.6844439387321473, 0.6941058218479157),
 (0.668782365322113, 0.6929935097694397),
 (nan, 0.6919471859931946),
 (nan, 0.6905447959899902)]

我選擇np.nan作為填充,因為然后我可以使用np.nanmean取均值,而忽略nan

In [479]: [np.nanmean(i) for i in T]                                                                         
Out[479]: 
[0.7078839093446732,
 0.6892748802900315,
 0.6808879375457764,
 0.6919471859931946,
 0.6905447959899902]

對於np.sum類的np.sum我可以填充0,但mean是總和除以計數。

或不使用nanmean ,填充一些易於過濾的內容:

In [480]: T = list(itertools.zip_longest(*X, fillvalue=None)) 
In [483]: [np.mean([i for i in row if i is not None]) for row in T]                                          
Out[483]: 
[0.7078839093446732,
 0.6892748802900315,
 0.6808879375457764,
 0.6919471859931946,
 0.6905447959899902]

zip_longest不是唯一的zip_longest ,但是它相當快,並且易於記住和使用。

這個怎么樣

首先確定最大行長度,然后將所有行用nans填充到相同的長度,並在問題中使用axis = 0的nanmean。

import numpy as np
X = [[0.6904056370258331, 0.6844439387321473, 0.668782365322113], 
     [0.7253621816635132, 0.6941058218479157, 0.6929935097694397, 0.6919471859931946, 0.6905447959899902]]

max_row_len=max([len(ll) for ll in X])

cm=np.nanmean([[el for el in row ] + [np.NaN] * max(0, max_row_len-len(row))  for row in X], axis=0)

print(cm)

將顯示

[0.70788391 0.68927488 0.68088794 0.69194719 0.6905448]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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