Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 允许包含不同长度列表的列表的元素平均值_Python_Python 3.x_Numpy - Fatal编程技术网

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

Python 允许包含不同长度列表的列表的元素平均值,python,python-3.x,numpy,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
的最终值可以如下所示:

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
的单个1D平均值。如果我尝试
np.mean(X,axis=0)
则会产生错误,因为
X[0]
X[1]
的长度不同。是否有一种方法可以实现我想要的,即单个1D平均值
X


谢谢,

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

In [475]: X = [[0.6904056370258331, 0.6844439387321473, 0.668782365322113],  
     ...:      [0.7253621816635132, 0.6941058218479157, 0.6929935097694397, 0.6919471859931946, 0.6905447959899902]] 
zip\u 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\u longest
不是唯一的一个,但它相当快,易于记忆和使用。

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

In [475]: X = [[0.6904056370258331, 0.6844439387321473, 0.668782365322113],  
     ...:      [0.7253621816635132, 0.6941058218479157, 0.6929935097694397, 0.6919471859931946, 0.6905447959899902]] 
zip\u 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\u longest
不是唯一的一款,但它速度相当快,而且易于记忆和使用。

这个怎么样

首先确定最大行长度, 然后将所有行填充为相同的长度,并使用 如问题所示,轴=0的平均值

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]

这个怎么样

首先确定最大行长度, 然后将所有行填充为相同的长度,并使用 如问题所示,轴=0的平均值

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]

问题在于Numpy不适用于非矩形列表。在这里,它只是看到一个以对象为元素的一维数组。对于这种情况,列表理解可能是最好的。或者,您可以使用pandas:
pd.DataFrame(X).mean(1)
。它将为您填充
nan
,并在平均值计算中忽略它们。如果您愿意填充nan或零,您可以使用-然后沿相关轴使用
sum
mean
。I“我想说,在你的列表中没有列这样的东西。但您可以将其转换为不同的列表
itertools.zip\u longest
可能是最方便的工具。@Divakar是的,这篇文章很完美。谢谢。问题是Numpy不适用于非矩形列表。在这里,它只是看到一个以对象为元素的一维数组。对于这种情况,列表理解可能是最好的。或者,您可以使用pandas:
pd.DataFrame(X).mean(1)
。它将为您填充
nan
,并在平均值计算中忽略它们。如果您愿意填充nan或零,您可以使用-然后沿相关轴使用
sum
mean
。I“我想说,在你的列表中没有列这样的东西。但您可以将其转换为不同的列表
itertools.zip\u longest
可能是最方便的工具。@Divakar是的,这篇文章很完美。非常感谢。