python 如何计算仅包含非零元素的二维numpy数组的行平均值,并从非零元素中减去平均值

bis0qfac  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(182)

我正在构建一个推荐系统。我使用NumPy数组来表示用户,其中每行是一个用户,每列是一部电影。我希望通过从非零元素中减去每行的平均值来规范化每行(即只从那些用户提供了评级的条目中)。我已经尝试了很多方法来使用np.where来做到这一点,np.nonzero()等等,但不能达到我想要的结果。例如,我有矩阵

x = np.array([[0,0,1,2,3],[0,0,2,3,4],[0,0,3,4,5.0]])

我想达到和这个一样的效果

for i in range(len(x)):
    y = np.mean(x[i][x[i].nonzero()])
    x[i][x[i].

非零()] -= y
其输出:

[[ 0.  0. -1.  0.  1.]
 [ 0.  0. -1.  0.  1.]
 [ 0.  0. -1.  0.  1.]]

但是以矢量化的方式,而不使用循环。
我试过了

mask = x!= 0
t = np.npwhere(mask, x-x.mean(axis=1).reshape(-1,1), x)

但我只想取非零元素的平均值。

zazmityj

zazmityj1#

首先计算where条件数组(要对哪些元素进行操作):

wh = x != 0

然后计算“所需”元素的平均值:

mn = np.mean(x, axis=1, where=wh)[:, np.newaxis]

请注意,[:, np.newaxis]会将 1-D 结果转换为具有单一数据行的 2-D 数组。
注意:Numpy1.20.0 版本中引入了 where 参数。如果您使用的是旧版本,请升级。
要获得结果,请运行:

result = np.where(wh, x - mn, x)

其结果是:

array([[ 0.,  0., -1.,  0.,  1.],
       [ 0.,  0., -1.,  0.,  1.],
       [ 0.,  0., -1.,  0.,  1.]])

相关问题