Python中numpy数组执行y**2为何有时结果错误?
为什么Python原生计算平方与numpy数组计算结果不一致?
问题复现
在Python 3.12.0的IDLE Shell中计算整数平方,结果符合预期:
>>> x = 123456 >>> x**2 15241383936
该结果与TI-89计算器的计算结果一致。
但使用numpy数组计算相同数值的平方时,却得到了错误的负数结果:
>>> import numpy as np >>> y = np.array([x]) >>> ysqr = y**2 array([-1938485248]) >>> ysqr[0] -1938485248
原因解析
出现差异的核心原因是整数溢出:
- Python原生的
int类型是任意精度的,无论数值多大都能准确存储,因此可以正确计算出123456²的结果。 - numpy创建数组时,会默认根据输入值推断数据类型。当传入普通整数时,numpy会选择**32位有符号整数(int32)**作为数组的
dtype,而123456²=15241383936远大于32位有符号整数的最大值(2^31 - 1 = 2147483647),超出范围的数值触发溢出,最终以补码形式解析为负数。
解决方案
针对科学计算场景,只需将整数转换为float类型后再创建numpy数组,即可规避溢出问题,得到与原生计算一致的结果:
>>> import numpy as np >>> y = np.array([float(x)]) >>> ysqr = y**2 array([1.52413839e+10]) >>> ysqr[0] 15241383936.0
内容的提问来源于stack exchange,提问作者SapereAude
相关产品推荐
相关产品推荐

