为何Numpy乘积结果相乘时会出现溢出错误?
问题原因分析与解决方案
这个溢出问题的核心是Numpy固定位宽整数类型与Python原生任意精度整数的差异,具体细节如下:
为什么会触发溢出警告?
在你使用的旧版本Numpy(对应Python 3.6的Numpy版本通常在1.11~1.14区间)中,np.prod()处理整数输入时,默认会使用Numpy的平台默认整数类型np.int_。而在Windows平台上,np.int_对应的是32位有符号整数(int32),它的取值范围是-2^31到2^31-1(也就是-2147483648到2147483647)。
你的两个计算结果:
self.value_1 = 262144(512*512)self.value_2 = 80160(1002*80)
它们的乘积是262144 * 80160 = 21013463040,这个数值远远超过了int32的最大值2147483647。当两个Numpy int32类型的数相乘时,会触发整数溢出,导致结果变成负数(这是补码溢出的典型表现),同时抛出RuntimeWarning。
而你用普通乘法得到的self.alt_value_1和self.alt_value_2是Python原生的int类型,Python的int是任意精度的,无论数值多大都不会发生溢出,所以相乘能得到正确结果。
如何直接修复现有代码?
有两种简单的方式可以解决这个问题:
1. 给np.prod()指定更大的整数类型
通过dtype参数指定使用64位整数(np.int64),它的最大值是9223372036854775807,完全能容纳你的乘积:
self.value_1 = np.prod(self.array_1.shape, dtype=np.int64) self.value_2 = np.prod(self.array_2.shape, dtype=np.int64)
2. 将np.prod()的结果转换为Python原生int
把Numpy返回的整数类型转换成Python的int,后续相乘就会使用Python的任意精度运算:
self.value_1 = int(np.prod(self.array_1.shape)) self.value_2 = int(np.prod(self.array_2.shape))
两种方式都能彻底解决溢出问题,你可以根据项目需求选择。
内容的提问来源于stack exchange,提问作者Folau
相关产品推荐
相关产品推荐

