如何对特征矩阵执行行归一化?解决NumPy广播报错问题
错误原因
- 本质是NumPy广播机制的维度匹配规则冲突:你调用
a.min(axis=1)、a.max(axis=1)时,会压缩掉axis=1的维度,得到的是形状为(4,)的一维数组,而原矩阵a的形状是(4,5)。 - NumPy广播要求从最后一个维度开始匹配,
(4,5)的最后一维长度是5,和(4,)的维度长度4无法匹配,因此触发维度不兼容的报错。
修复方案
有两种常用的修复方式:
方案1:求最值时保留维度
调用min/max时传入keepdims=True参数,直接得到形状为(4,1)的二维数组,无需手动调整维度:
import numpy as np a = np.random.randint(10, size=(4,5)) # 行归一化实现 min_row = a.min(axis=1, keepdims=True) max_row = a.max(axis=1, keepdims=True) normalized_a = (a - min_row) / (max_row - min_row)
方案2:手动给一维数组增加维度
如果不想改最值计算的逻辑,可以给计算得到的一维行最值新增维度,适配广播规则:
# 等价写法,用[:, np.newaxis]新增维度 min_row = a.min(axis=1)[:, np.newaxis] max_row = a.max(axis=1)[:, np.newaxis] normalized_a = (a - min_row) / (max_row - min_row)
补充注意:如果某一行的所有元素值都相同,会出现分母为0的情况,得到
nan值,可以根据业务需求给分母加一个极小值(比如1e-8)避免除以0的问题。
内容的提问来源于stack exchange,提问作者kapooraae489
相关产品推荐
相关产品推荐

