“溢出错误:Python int too large to convert to C long”在Windows上,但在Mac上不是

mwkjh3gx  于 2023-05-23  发布在  Windows
关注(0)|答案(5)|浏览(185)

我在windows和mac上运行完全相同的代码,用python3.564位。
在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

不过,这段代码在我的Mac上运行得很好。有谁能帮助解释一下为什么或者为windows上的代码给予一个解决方案吗?非常感谢!

tv6aics1

tv6aics11#

当你的数字大于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

您可以通过检查确认:

>>> import sys
>>> sys.maxsize
2147483647

要获得更高精度的数字,不要传递一个int类型,它在幕后使用一个有界的C整数。使用默认的浮点数:

>>> preds = np.zeros((1, 3))
bogh5gae

bogh5gae2#

您可以使用dtype=np.int64而不是dtype=int

cbwuti44

cbwuti443#

有人能解释一下原因吗
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上的代码一个解决方案?非常感谢!
选择大小与平台无关的数据类型。你可以在www.example.com找到这个列表https://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#arrays-scalars-built-in,最明智的选择可能是np.int64

  • Numpy确实允许Python对象的数组,但我不认为它们被广泛使用。
nmpmafwu

nmpmafwu4#

转换为float:

import pandas as pd

df = pd.DataFrame()
l_var_l = [8258255190131389999999000003296, 50661]
df['temp'] = l_var_l
df['temp'] = df['temp'].astype(int)

以上失败,错误:

OverflowError: Python int too large to convert to C long.

现在尝试使用float转换:

df['temp'] = df['temp'].astype(float)
cld4siwp

cld4siwp5#

我在尝试将对象类型列(实际上是字符串)转换为整数类型时也遇到了同样的错误。
这不起作用:

df['var1'] = df['var1'].astype(int)

这样做奏效了:

df['var1'] = df['var1'].apply(lambda x: int(x))

相关问题