我正在构建一个推荐系统。我使用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)
但我只想取非零元素的平均值。
1条答案
按热度按时间zazmityj1#
首先计算where条件数组(要对哪些元素进行操作):
然后计算“所需”元素的平均值:
请注意,
[:, np.newaxis]
会将 1-D 结果转换为具有单一数据行的 2-D 数组。注意:Numpy 的 1.20.0 版本中引入了 where 参数。如果您使用的是旧版本,请升级。
要获得结果,请运行:
其结果是: