Numpy的loadtxt(): OverflowError: Python整数过大无法转换为C长整型
我正在尝试使用 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 这样的形式,我不想要这种情况。
所以我的问题是:
如何解决这个 OverflowError 错误?
如果无法解决,那我该如何防止 numpy 对 ID 进行这样的处理?
3 个回答
如果第一列是一个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位的数据类型了。
你需要使用一种复合数据类型,也就是每一列用不同的类型。或者你可以使用 np.genfromtxt
,不指定任何数据类型,这样它会自动根据每一列来判断类型,这样做可能会更简单一些(不过可能性能稍微差一点,错误检查也会少一些)。
你的数字看起来可以放进 uint64_t
这种类型里,如果你使用的是C99版本的话。