【问题标题】:Numpy's loadtxt(): OverflowError: Python int too large to convert to C longNumpy 的 loadtxt(): OverflowError: Python int too large to convert to C long
【发布时间】:2014-10-14 13:24:52
【问题描述】:

我正在尝试使用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. 溢出错误如何解决?

  2. 如果无法解决,那我怎么能阻止 numpy 对 ids 这样做呢?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您需要使用复合数据类型,每列有一个单独的类型。或者您可以使用 np.genfromtxt 而不指定任何 dtype,它会根据每列自动确定,这可能会以更少的努力为您提供所需的内容(但性能可能会稍低一些,错误检查也会更少)。

    【讨论】:

    • 这并没有解决问题,因为它在第一列中使用了浮点数,而我不希望它使用浮点数。
    【解决方案2】:

    您的号码看起来适合 uint64_t 类型,如果您有 C99,则可用。

    【讨论】:

    • 我找不到numpy.uint64_t。只有uint64
    • numpy 调用无符号 64 位整数 uint64,C/C++ 调用它 uint64_t。它们代表相同的东西。
    【解决方案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。如果您需要更高的精度,可以将 64 位数据类型增加 4 到 8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-08
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      相关资源
      最近更新 更多