Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.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_Arrays_Numpy - Fatal编程技术网

Python 计算非零元素每列或每行平均值的有效方法

Python 计算非零元素每列或每行平均值的有效方法,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组,用于用户在电影中给出的评级。评级介于1和5之间,而0表示用户不对电影进行评级。我想计算每部电影的平均收视率,以及每个用户的平均收视率。换句话说,我将计算非零元素的每列或每行的平均值 是否有一个有效的numpy数组函数来处理这种情况?我知道按列或行手动迭代评级可以解决这个问题 提前谢谢 由于要丢弃的值为0,您可以通过沿轴求和,然后除以非零元素的数量(沿同一轴)手动计算平均值: 结果: array([ 8. , 5.5]) 如您所见,在平均值中不考虑零。在将所有0值转换为

我有一个numpy数组,用于用户在电影中给出的评级。评级介于1和5之间,而0表示用户不对电影进行评级。我想计算每部电影的平均收视率,以及每个用户的平均收视率。换句话说,我将计算非零元素的每列或每行的平均值

是否有一个有效的numpy数组函数来处理这种情况?我知道按列或行手动迭代评级可以解决这个问题


提前谢谢

由于要丢弃的值为0,您可以通过沿轴求和,然后除以非零元素的数量(沿同一轴)手动计算平均值:

结果:

array([ 8. ,  5.5])

如您所见,在平均值中不考虑零。

在将所有
0
值转换为
np.nan
后,您可以使用
np.nan
。请注意,
np.nanmean
仅在
numpy 1.8
中可用

import numpy as np

ratings = np.array([[1,4,5,0],
                    [2,0,3,0],
                    [4,0,0,0]], dtype=np.float)


def get_means(ratings):
    ratings[np.where(ratings == 0)] = np.nan

    user_means = np.nanmean(ratings, axis=1)
    movie_means = np.nanmean(ratings, axis=0)

    return {'user_means' : user_means, 'movie_means' : movie_means}
结果:

>>> get_means(ratings)
{'movie_means': array([ 2.33333333,  4.        ,  4.        ,         nan]), 

'user_means': array([ 3.33333333,  2.5       ,  4.        ])}

另一种方法是使用屏蔽数组,屏蔽0值。例如(使用@Akavali的样本数据):

使用
ratings==0
作为掩码,创建
ratings
的掩码版本:

In [31]: mratings = np.ma.masked_array(ratings, mask=ratings==0)

In [32]: mratings
Out[32]: 
masked_array(data =
 [[1.0 4.0 5.0 --]
 [2.0 -- 3.0 --]
 [4.0 -- -- --]],
             mask =
 [[False False False  True]
 [False  True False  True]
 [False  True  True  True]],
       fill_value = 1e+20)
现在计算沿每个轴的平均值:

In [33]: mratings.mean(axis=0)
Out[33]: 
masked_array(data = [2.3333333333333335 4.0 4.0 --],
             mask = [False False False  True],
       fill_value = 1e+20)

In [34]: mratings.mean(axis=1)
Out[34]: 
masked_array(data = [3.3333333333333335 2.5 4.0],
             mask = [False False False],
       fill_value = 1e+20)

阵列是如何组织的?您能给出一个如何加载数组的代码示例吗?如果您是从文件加载的,请同时发布文件格式的示例。不要忘记接受答案,@GarudaReiga。
nanmean
是在1.8版中添加到numpy的,但在
scipy.stats
中也有一个版本已经存在了很长时间。
In [31]: mratings = np.ma.masked_array(ratings, mask=ratings==0)

In [32]: mratings
Out[32]: 
masked_array(data =
 [[1.0 4.0 5.0 --]
 [2.0 -- 3.0 --]
 [4.0 -- -- --]],
             mask =
 [[False False False  True]
 [False  True False  True]
 [False  True  True  True]],
       fill_value = 1e+20)
In [33]: mratings.mean(axis=0)
Out[33]: 
masked_array(data = [2.3333333333333335 4.0 4.0 --],
             mask = [False False False  True],
       fill_value = 1e+20)

In [34]: mratings.mean(axis=1)
Out[34]: 
masked_array(data = [3.3333333333333335 2.5 4.0],
             mask = [False False False],
       fill_value = 1e+20)