二维numpy数组行归一化后替换行结果全为0的问题求解
问题原因
你初始化的array2d由np.arange(20)生成,numpy默认生成的是整数类型数组,该类型仅支持存储整数值。当你计算得到每行的归一化结果(均为小于1的浮点数)后,赋值回原整数数组时,numpy会自动对浮点数做截断取整,小于1的正数会全部转为0,因此最终输出全0数组。
解决方法
你可以通过调整数组类型或者使用更高效的向量化写法解决该问题:
- 方法1:初始化数组时直接指定浮点类型
生成数组时添加dtype参数设定为浮点型,示例代码:import numpy as np array2d = np.arange(20, dtype=np.float64).reshape(4,5) for i in range(4): array2d[i] = array2d[i] / np.sum(array2d[i]) - 方法2:计算前转换数组类型
若不便修改初始化逻辑,可在计算前调用astype方法转换类型:import numpy as np array2d = np.arange(20).reshape(4,5).astype(np.float64) for i in range(4): array2d[i] = array2d[i] / np.sum(array2d[i]) - 方法3:使用向量化操作省略循环(性能更优)
利用numpy的广播特性,无需手写循环即可完成逐行归一化:
其中import numpy as np array2d = np.arange(20, dtype=np.float64).reshape(4,5) array2d = array2d / array2d.sum(axis=1, keepdims=True)axis=1指定按行求和,keepdims=True保证求和后的维度和原数组匹配,避免广播报错。
以上方法运行后均可得到你预期的归一化结果。
内容的提问来源于stack exchange,提问作者djokovic
相关产品推荐
相关产品推荐

