取非零列的平均值

2024-04-26 19:02:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个矩阵-

matrix=[[0,0,1,1],[1,2,0,1],[9,0,1,0],[1,1,2,0]]

我想按列平均,但我只想在列中包含非零值。 我用了以下方法-

array= [float(sum(col))/len(col)  for col in zip(*matrix)]

但它在第一列显示2.75,而它应该是1+9+1/3=3.6


Tags: 方法inforlen矩阵colzipfloat
3条回答

直接替代你的方法是,应该是其他方法中最快的(对于这种规模的问题):

>>> array= [float(sum(col))/sum(map(bool,col))  for col in zip(*matrix)]
>>> array
[3.6666666666666665, 1.5, 1.3333333333333333, 1.0]

编辑:

一种更稳健的方法,处理所有为零的列:

>>> matrix=[[0,0,1,0],[1,2,0,0],[9,0,1,0],[1,1,2,0]]
>>> array= [float(sum(col))/sum(map(bool,col)) if sum(map(bool,col))>0 else 0 for col in zip(*matrix)]
>>> array
[3.6666666666666665, 1.5, 1.3333333333333333, 0]

使用numpy:

import numy as np
matrix=np.array([[0,0,1,1],[1,2,0,1],[9,0,1,0],[1,1,2,0]])
array=[np.mean(col[col!=0]) for col in matrix.T]
#array is: [3.6666666666666665, 1.5, 1.3333333333333333, 1.0]

以下是pd.DataFrame().mask的方法:

df = pd.DataFrame(matrix)
df.mask(df.eq(0)).mean()

输出:

0    3.666667
1    1.500000
2    1.333333
3    1.000000
dtype: float64

相关问题 更多 >