Numpy的loadtxt():OverflowError:Python int太大而无法转换为C long

时间:2014-10-14 13:24:52

标签: python numpy

我正在尝试使用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这样的东西,我不想要这种行为。

所以我的问题:

  1. 如何解决OverflowError?

  2. 如果无法解决问题,那我怎么能阻止numpy对ids进行解决?

3 个答案:

答案 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。