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 long
has 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.
Nauczyłem się czegoś nowego tutaj. Dzięki za publikację! – mgilson