允许包含不同长度列表的列表的逐元素均值

时间:2019-07-08 19:18:59

标签: python python-3.x numpy

我有一个代码,其中有一个列表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进行元素方式(列方式)的均值生成X的单个一维均值。如果我尝试np.mean(X, axis=0),则会引起错误,因为X[0]X[1]的长度不同。有没有一种方法可以实现我想要的目标,即X的一维均值?

谢谢

2 个答案:

答案 0 :(得分:2)

要进行“列”计算,我们需要将其更改为列列表。

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之类的东西,我可以填写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不是唯一的一个,但是它相当快,并且易于记住和使用。

答案 1 :(得分:0)

怎么样

首先确定最大行长, 然后使用nans和use将所有行填充到相同长度 问题中轴为= 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]