Numpy的loadtxt(): OverflowError: Python整数过大无法转换为C长整型

2 投票
3 回答
2652 浏览
提问于 2025-04-27 12:13

我正在尝试使用 numpy 从文件中加载一个矩阵。当我使用除了 float 以外的任何 dtype 时,就会出现这个错误:

OverflowError: Python int too large to convert to C long

代码是: X = np.loadtxt(feats_file_path, delimiter=' ', dtype=np.int64 )

问题在于我的矩阵只有整数,而我不能使用 float,因为矩阵的第一列是整数“键”,用来表示节点的 ID。当我使用 float 时,numpy 会把整数 ID 四舍五入成像 32423e^10 这样的形式,我不想要这种情况。

所以我的问题是:

  1. 如何解决这个 OverflowError 错误?

  2. 如果无法解决,那我该如何防止 numpy 对 ID 进行这样的处理?

暂无标签

3 个回答

0

如果第一列是一个ID,那么你可能不会用它做数学运算。你甚至可能希望保留ID前面的零。所以,使用字符串可能比整数更合适。

你可以创建一个结构化的数组,里面可以包含复合数据类型。下面我创建了一个记录数组,每个记录都有空间存放一个10个字符长的字符串和两个32位的整数。

>>> arr = numpy.loadtxt(b"""01 24 54
                            02 17 968
                            03 36 23""".split(b"\n"), 
                        dtype=[("id", "a10"),("values", "2i4")])
>>> arr
array([(b'01', [24, 54]), (b'02', [17, 968]), (b'03', [36, 23])], 
      dtype=[('id', 'S10'), ('values', '<i4', (2,))])
>>> arr["id"]
array([b'01', b'02', b'03'], 
      dtype='|S10')
>>> arr["values"]
array([[ 24,  54],
       [ 17, 968],
       [ 36,  23]], dtype=int32)
>>> arr[0]
(b'01', [24, 54])
>>> arr["values"] += 1
>>> arr
array([(b'01', [25, 55]), (b'02', [18, 969]), (b'03', [37, 24])], 
      dtype=[('id', 'S10'), ('values', '<i4', (2,))])

这里的 dtype 是一个元组的列表,每个元组的第一个元素是字段名称,第二个元素是数据类型。"a10" 表示一个10个字符的字符串。你可以找一下你最长的ID有多少个字符,然后把10换成合适的数字。2i4 表示有两列 i4,也就是32位(4字节)的整数。如果你需要浮点数,就把 i 改成 f。如果你需要更高的精度,可以把4改成8,这样就变成64位的数据类型了。

0

你需要使用一种复合数据类型,也就是每一列用不同的类型。或者你可以使用 np.genfromtxt,不指定任何数据类型,这样它会自动根据每一列来判断类型,这样做可能会更简单一些(不过可能性能稍微差一点,错误检查也会少一些)。

0

你的数字看起来可以放进 uint64_t 这种类型里,如果你使用的是C99版本的话。

撰写回答