如何用更优雅的方式实现NumPy矩阵行与对应标量的逐元素相乘?
无需循环实现矩阵行与对应标量的逐元素相乘
可以利用NumPy的广播机制实现,完全替代手动循环,代码更简洁高效:
import numpy as np def normalise(matrix): norm_c = 1.0 / matrix.sum(axis=1) # 通过[:, np.newaxis]将一维向量转为列向量,触发广播 matrix = matrix * norm_c[:, np.newaxis] return matrix
原理说明
norm_c是通过sum(axis=1)得到的一维数组(形状为(N,),N是矩阵行数),而原矩阵形状为(N,M)。通过[:, np.newaxis]将norm_c的形状转换为(N,1),此时NumPy会自动触发广播机制,将这个列向量扩展为(N,M)的维度,和原矩阵逐元素相乘,效果和循环每行相乘完全一致。
其他等价写法
除了[:, np.newaxis],还可以用以下方式调整维度:
- 使用
reshape:norm_c.reshape(-1, 1) - 使用
np.expand_dims:np.expand_dims(norm_c, axis=1)
示例:
matrix = matrix * norm_c.reshape(-1, 1)
验证效果
测试代码:
test_matrix = np.array([[1,2,3], [4,5,6]]) print(normalise(test_matrix))
输出结果:
[[0.16666667 0.33333333 0.5 ] [0.26666667 0.33333333 0.4 ]]
内容的提问来源于stack exchange,提问作者Scolpe
相关产品推荐
相关产品推荐

