NumPy二维数组元素两两求和出现负数异常问题求助
解决整数对求和时出现负数的问题
这是典型的整数溢出问题!让我帮你分析下原因并给出解决方案:
问题重现
你的目标是生成由列表中每对元素求和组成的二维NumPy数组,比如输入[1,2,3]时期望得到[[0,1,2],[1,2,3],[2,3,4]]。但处理大数值列表时出现了负数,你的列表和函数代码如下:
import numpy as np weird_list = [800153196, 946067665, 827629917, 868941741, 875745873, 926109150, 1353347195, 1003235074, 1053666891, 1442194993, 1924716858, 1060724069, 1182240731, 1646547575, 1215762661, 1520107722, 1512568609, 1534064291, 1549459216, 1773697582, 1853820087, 1696910852, 1563415785, 1692314635, 1627783113] def array_sum(i_list): i_array = np.array(i_list) # 将列表转换为np.array i_array_rs1 = i_array.reshape(1, -1) i_array_rs2 = i_array.reshape(-1, 1) i_array_rs_SUM = i_array_rs1 + i_array_rs2 print(i_array_rs_SUM)
问题根源
NumPy会默认根据输入元素的大小推断数组的数据类型。你的列表里单个元素都在32位有符号整数(int32)的范围内(int32最大值为2147483647),所以默认创建的数组类型是int32。但当两个这样的数相加时,比如1924716858 + 1853820087 = 3778536945,这个结果远超int32的最大值,触发了补码溢出——溢出后的数值会被截断成负数,这就是你看到异常结果的原因。
解决方案
在创建NumPy数组时,明确指定一个更大的数据类型int64,它的取值范围足够覆盖你列表中任意两个元素的和。修改后的函数如下:
import numpy as np def array_sum(i_list): # 指定dtype为int64,彻底避免溢出问题 i_array = np.array(i_list, dtype=np.int64) i_array_rs1 = i_array.reshape(1, -1) i_array_rs2 = i_array.reshape(-1, 1) i_array_rs_SUM = i_array_rs1 + i_array_rs2 print(i_array_rs_SUM)
为什么有效
int64能表示的范围是-9223372036854775808到9223372036854775807,你列表中最大的两个数相加结果仅为3778536945,远小于int64的最大值,所以不会再出现溢出导致的负数。
内容的提问来源于stack exchange,提问作者Iulian Popa
相关产品推荐
相关产品推荐

