Numpy行归一化实现求助:矩阵元素归一化遇异常
解决矩阵列归一化的问题
我一眼就看到你代码里的核心问题啦——你搞混了求和的轴方向!你要做的是列归一化(每个元素除以对应列的和),但你的代码里用了axis=1,这是按行求和,自然得不到正确结果。我来一步步帮你修正:
问题分析
你的需求是:给定矩阵M,每个非零元素除以其所在列的列和进行归一化。而当前代码的问题:
np.sum(class_matrix, axis=1)计算的是每行的和,不是列和,这直接导致后续的倒数数组方向完全错误- 虽然处理了无穷大的情况,但整体逻辑方向不对,所以结果不符合预期
修正后的代码实现
import numpy as np # 假设class_matrix是你的输入矩阵 class_matrix = np.array([[1, 0, 3], [2, 0, 6], [3, 0, 9]]) # 1. 计算每一列的和,axis=0对应列方向求和 col_sums = np.sum(class_matrix, axis=0) # 2. 处理列和为0的情况:避免除以零,将这些列的倒数设为0(因为列和为0时所有元素都是0,归一化后还是0) col_reciprocal = np.where(col_sums == 0, 0, 1 / col_sums.astype(np.float32)) # 3. 利用numpy广播机制,实现每个元素除以对应列的和 final_matrix = class_matrix * col_reciprocal print(final_matrix)
代码解释
- 列和计算:
axis=0告诉numpy沿着列的方向求和,得到的col_sums是一个一维数组,每个元素对应原矩阵的一列之和 - 零和处理:用
np.where判断列和是否为0,为0的位置设为0(避免产生inf),否则取列和的倒数 - 广播相乘:numpy会自动把一维的
col_reciprocal广播成和原矩阵同形状的二维数组,然后逐元素相乘,刚好实现每个元素除以对应列的和
额外说明
- 对于非零元素的处理:如果列和不为0,零元素除以列和还是0,完全符合你的需求;如果列和为0,那该列所有元素都是0,处理后也保持0,无需额外判断非零元素
- 如果你想更简洁,也可以用
np.divide直接做除法,同样能处理广播:
这个写法直接在除法时指定final_matrix = np.divide(class_matrix, col_sums, out=np.zeros_like(class_matrix, dtype=np.float32), where=col_sums != 0)where条件,只有列和不为0的位置才执行除法,否则输出0,一步到位。
内容的提问来源于stack exchange,提问作者sdgaw erzswer
相关产品推荐
相关产品推荐

