如何更高效计算numpy.ndarray中用户行与所有物品行的点积
你的需求可以直接用numpy原生向量化操作实现,完全不需要Python层循环,还能直接得到numpy数组结果,性能提升非常明显。
实现方案
方案1:广播逐元素乘后按行求和(可读性最高)
直接利用numpy的广播机制,把用户向量和所有物品向量逐元素相乘,再按行求和得到点积结果,直接返回numpy.ndarray类型:
np_scores = np.sum(user_factors[user_id] * item_factors, axis=1)
方案2:矩阵乘法(性能最优,适合大维度场景)
利用矩阵乘法底层优化的特性,计算效率比方案1更高,适合物品量级大、隐向量维度高的场景:
# 写法1:@运算符(numpy版本>=1.10.0支持) np_scores = user_factors[user_id] @ item_factors.T # 写法2:np.dot通用写法 np_scores = np.dot(user_factors[user_id], item_factors.T)
优势说明
- 完全避免Python层循环,所有计算都在numpy底层C实现中完成,性能是原有循环版本的数百到数千倍,数据量越大优势越明显
- 计算结果直接是
numpy.ndarray类型,省去了list转数组的额外开销
注意:以上实现默认你的
user_factors维度为(用户总数, 隐向量维度)、item_factors维度为(物品总数, 隐向量维度),如果你的存储维度顺序相反,调整转置位置即可。
内容的提问来源于stack exchange,提问作者kevin811
相关产品推荐
相关产品推荐

