You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将NumPy数组归一化至和为1.0在Intel CPU及Colab中失败

数组归一化至和为1失败的原因及解决办法

尝试将数组归一化至和为1的操作多次失败,示例代码在Intel CPU及Colab环境中运行时断言报错:

import numpy as np

a = 0.99
choice = 0
g = np.ones((9,)) * (1.0 - a)/8
g[choice] = a
print(np.sum(g), g)
g = g / np.sum(g) 
print(np.sum(g), g)
assert(np.sum(g) == 1.0)

问题根源

这是浮点数精度限制导致的问题。计算机以二进制形式存储浮点数,部分十进制小数无法被精确表示,会产生微小的近似误差。

你的代码中,理论上np.sum(g)初始值应为1,但实际计算时可能得到类似0.9999999999999999或1.0000000000000002的结果。后续除以这个和后,数组的和依然会因精度问题无法严格等于1.0,导致断言失败。

解决办法

1. 使用近似相等判断替代严格相等

用np.isclose()函数验证,它允许设置微小的误差容忍范围,符合浮点数运算的实际情况:

import numpy as np

a = 0.99
choice = 0
g = np.ones((9,)) * (1.0 - a)/8
g[choice] = a
g = g / np.sum(g) 
print(np.sum(g), g)
assert np.isclose(np.sum(g), 1.0)

2. 直接构造时强制和为1

调整数组构造逻辑,通过计算最后一个元素的值来确保总和严格为1:

import numpy as np

a = 0.99
choice = 0
g = np.ones((9,)) * (1.0 - a)/8
g[choice] = a
# 用1减去前8个元素的和,强制最后一个元素让总和为1
g[-1] = 1.0 - np.sum(g[:-1])
print(np.sum(g), g)
assert np.sum(g) == 1.0

3. 跳过冗余的归一化步骤

你的初始数组理论上和已经是1,只是浮点数精度导致微小偏差。如果不需要额外归一化,可以直接用np.isclose()验证,省去除以总和的步骤:

import numpy as np

a = 0.99
choice = 0
g = np.ones((9,)) * (1.0 - a)/8
g[choice] = a
print(np.sum(g), g)
assert np.isclose(np.sum(g), 1.0)

内容的提问来源于stack exchange,提问作者Reza Roboubi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:37:22