"OverflowError:Python int太大而无法转换为C long"在Windows上但不是mac

pac*_*ear 21 python windows int long-integer

我在Windows和Mac上运行完全相同的代码,使用python 3.5 64位.

在Windows上,它看起来像这样:

>>> import numpy as np
>>> preds = np.zeros((1, 3), dtype=int)
>>> p = [6802256107, 5017549029, 3745804973]
>>> preds[0] = p
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    preds[0] = p
OverflowError: Python int too large to convert to C long
Run Code Online (Sandbox Code Playgroud)

但是,此代码在我的Mac上运行正常.任何人都可以帮助解释为什么或为Windows上的代码提供解决方案?非常感谢!

sam*_*aya 19

您可以使用dtype=np.int64代替dtype=int

  • 我尝试使用 `np.int64` 和 `np.uint64` 来存储 109323892912381287389218291378123872293293923929392929289283928 都不起作用 (3认同)

Mos*_*oye 16

一旦你的数字大于sys.maxsize:你就会得到那个错误:

>>> p = [sys.maxsize]
>>> preds[0] = p
>>> p = [sys.maxsize+1]
>>> preds[0] = p
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long
Run Code Online (Sandbox Code Playgroud)

您可以通过检查确认:

>>> import sys
>>> sys.maxsize
2147483647
Run Code Online (Sandbox Code Playgroud)

要获取具有更大精度的数字,请不要传递在幕后使用有界C整数的int类型.使用默认的浮点数:

>>> preds = np.zeros((1, 3))
Run Code Online (Sandbox Code Playgroud)

  • @VeronicaWenqianCheng 不要传递 int dtype,使用默认浮点数。 (3认同)
  • 如果您得到的数字大于此,该如何解决? (2认同)
  • 如果它需要作为索引传递,然后需要是 int 怎么办? (2认同)
  • MosesKoledoye 我认为@fireball 意味着如果需要非浮点数作为索引参数,因此不能是浮点数(你说需要它来规避这个问题)怎么办?应该做 int(float(x)) - 当然不应该吗? (2认同)

plu*_*ash 7

谁能帮忙解释一下为什么

Numpy 数组通常*具有固定大小的元素,包括各种大小的整数、单精度或双精度浮点数、固定长度字节和 Unicode 字符串以及由上述类型构建的结构。

在 Python 2 中,python“int”相当于 C long。在Python 3中,“int”是任意精度类型,但numpy在创建数组时仍然使用“int”来表示C类型“long”。

C long 的大小取决于平台。在 Windows 上它始终是 32 位的。在类 Unix 系统上,32 位系统上通常为 32 位,64 位系统上通常为 64 位。

或者给出windows上代码的解决方案?非常感谢!

选择大小与平台无关的数据类型。您可以在https://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#arrays-scalars-built-in找到该列表, 最明智的选择可能是 np.int64

* Numpy 确实允许使用 python 对象数组,但我不认为它们被广泛使用。