我有一个代码,其中有一个列表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
的单一一维平均值?
谢谢
要进行"列"计算,我们需要将其更改为列列表。
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
这样的东西,我可以填充 will 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
不是唯一的,但它相当快,并且易于记忆和使用。
怎么样
首先确定最大行长,然后用 nans 填充所有行到相同的长度和使用轴=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 ]