“OverflowError: Python int te groot om naar C lang te converteren” op Windows maar niet op mac

Ik gebruik exact dezelfde code op zowel Windows als Mac, met python 3.5 64 bit.

In Windows ziet het er als volgt uit:

>>> 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

Deze code werkt echter prima op mijn Mac. Kan iemand helpen uitleggen waarom of een oplossing geven voor de code op Windows? Heel erg bedankt!


Antwoord 1, autoriteit 100%

Je krijgt die foutmelding zodra je getallen groter zijn dan 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

Je kunt dit bevestigen door het volgende aan te vinken:

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

Als u getallen met grotere precisie wilt nemen, moet u achter de schermen geen int-type doorgeven dat een begrensd C-geheel getal gebruikt. Gebruik de standaard float:

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

Antwoord 2, autoriteit 63%

U kunt dtype=np.int64gebruiken in plaats van dtype=int


Antwoord 3, autoriteit 13%

Kan iemand uitleggen waarom

In Python 2 was een python “int” gelijk aan een C-lang. In Python 3 is een “int” een willekeurig precisietype, maar numpy gebruikt nog steeds “int” om het C-type “long” weer te geven bij het maken van arrays.

De maat van een C-long is platformafhankelijk. Op Windows is het altijd 32-bits. Op Unix-achtige systemen is het normaal gesproken 32 bit op 32 bit systemen en 64 bit op 64 bit systemen.

of een oplossing geven voor de code op windows? Heel erg bedankt!

Kies een gegevenstype waarvan de grootte niet platformafhankelijk is. Je kunt de lijst vinden op https: //docs.scipy.org/doc/numpy/reference/arrays.scalars.html#arrays-scalars-built-inde meest verstandige keuze zou waarschijnlijk np.int64 zijn


Antwoord 4

Converteren naar zwevend:

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

Bovenstaande mislukt met fout:

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

Probeer nu met float-conversie:

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

Other episodes