我正在尝试使用numpy
从文件加载矩阵。当我使用除dtype
以外的任何float
时,我收到此错误:
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对ids进行解决?
答案 0 :(得分:0)
您需要使用复合dtype,每列使用单独的类型。或者您可以在不指定任何dtype的情况下使用np.genfromtxt
,并且将根据每列自动确定,这可能会以较少的工作量为您提供所需的内容(但可能会略微降低性能并减少错误检查)。
答案 1 :(得分:0)
您的号码似乎适合uint64_t
类型,如果您有C99,则可以使用此类型。
答案 2 :(得分: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
。如果需要更高的精度,64位数据类型可以增加4到8。