2013-03-13 20 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 co tu się dzieje? math.sqrt wydaje się nie mieć tego samego problemu.Dziwne zachowanie np.sqrt dla dużych liczb całkowitych

+4

Nauczyłem się czegoś nowego tutaj. Dzięki za publikację! – mgilson

Odpowiedz

8

Ostateczna liczba jest long (nazwa Pythona dla dowolnej liczby całkowitej precyzji), który NumPy najwyraźniej nie może uporać się z:

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

AttributeError występuje, ponieważ NumPy, widząc rodzaju, że nie robi wiedzieć, jak sobie poradzić, domyślnie wywołuje metodę sqrt na obiekcie; ale to nie istnieje. Więc nie jest to numpy.sqrt, którego brakuje, ale long.sqrt.

W przeciwieństwie do tego, math.sqrt wie o long. Jeśli masz zamiar radzić sobie z bardzo dużymi liczbami w NumPy, używaj pływaków, ilekroć jest to wykonalne.

EDIT: Dobra, używasz Python 3. Choć rozróżnienie między int i longhas disappeared w tej wersji, NumPy jest nadal wrażliwy na różnicę między PyLongObject które z powodzeniem mogą być konwertowane do C long wykorzystaniem PyLong_AsLong i taki, który nie może.

+1

Ale, ale, ale to nie wyjaśnia 'AttributeError' ... Jak to przypadkowo usuwa' sqrt' z przestrzeni nazw 'numpy'? To musi być błąd ... – mgilson

+0

@mgilson: Dosyłałem do tego :) –

+0

(Jestem pewien, że to jest powód błędu btw - Ale to jest bardzo dziwny błąd) – mgilson