2013-03-13 8 views
7
>>> np.__version__ 
'1.7.0' 
>>> np.sqrt(10000000000000000000) 
3162277660.1683793 
>>> np.sqrt(100000000000000000000.) 
10000000000.0 
>>> np.sqrt(100000000000000000000) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: sqrt 

Huh ... AttributeError: sqrt was geht hier dann los? math.sqrt scheint nicht das gleiche Problem zu haben.Seltsames Verhalten von np.sqrt für große ganze Zahlen

+4

Hier etwas Neues gelernt. Danke fürs Schreiben! – mgilson

Antwort

8

Die endgültige Zahl ist ein long (Python Name für eine beliebige Präzision ganze Zahl), die NumPy offenbar nicht umgehen kann:

>>> type(100000000000000000000) 
<type 'long'> 
>>> type(np.int(100000000000000000000)) 
<type 'long'> 
>>> np.int64(100000000000000000000) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OverflowError: Python int too large to convert to C long 

Die AttributeError tritt auf, weil NumPy, eine Art zu sehen, dass es nicht der Fall ist wissen, wie man damit umgeht, ruft standardmäßig die Methode sqrt auf dem Objekt auf; aber das existiert nicht. Es ist also nicht numpy.sqrt, die fehlt, aber long.sqrt.

Im Gegensatz dazu math.sqrt weiß über long. Wenn Sie mit sehr großen Zahlen in NumPy umgehen wollen, verwenden Sie Floats, wann immer dies möglich ist.

EDIT: Okay, sind Sie mit 3. Python Während die Unterscheidung zwischen int und longhas disappeared in dieser Version NumPy noch empfindlich auf die Differenz zwischen einem PyLongObject ist, die erfolgreich in ein C umgerechnet werden können longPyLong_AsLong mit und eine, die nicht kann.

+1

Aber, aber, aber, das erklärt nicht den 'AttributError' ... Wie entfernt das versehentlich' sqrt' aus dem 'numpy' Namensraum? Das muss ein Fehler sein ... – mgilson

+0

@mgilson: Ich war dabei :) –

+0

(Ich bin sicher, das ist der Grund für den Fehler btw - Aber es ist ein sehr seltsamer Fehler) – mgilson