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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:40:22