如何单独修改2D numpy数组的行 按行均值归一化后原数组未更新
问题原因与解决方案
问题根源
- 你代码中的
i是遍历2D数组时生成的临时变量,直接执行i = i / np.mean(i)只是让i指向了新生成的归一化数组,没有对baseline字典里存储的原2D数组做修改,所以外层遍历字典时看不到更新。 - 只有对原数组的指定位置执行原位赋值操作,才会修改原数组的实际存储内容。
额外优化提示:遍历
items时已经拿到了数组对象value,不需要再通过baseline[str(key)]重复查找取值。
修正后的代码
写法1:保留行循环逻辑(仅修复赋值问题)
通过索引定位到原数组的对应行,直接原位赋值:
for key, value in sorted(baseline.items()): for row_idx in range(value.shape[0]): value[row_idx] = value[row_idx] / np.mean(value[row_idx])
写法2:numpy向量化实现(更高性能)
无需逐行写Python循环,利用numpy的广播特性直接完成整组的行归一化,大数组下性能提升明显:
for key, value in sorted(baseline.items()): # axis=1 按行求均值,keepdims=True 保持维度匹配广播规则 value /= value.mean(axis=1, keepdims=True)
补充注意:如果你的数据存在行均值为0的情况,建议先做异常值过滤,避免出现除0得到
inf的问题。
内容的提问来源于stack exchange,提问作者Eric Teboul
相关产品推荐
相关产品推荐

