Конечное число является long
(имя Python для произвольной точности целое число), которые NumPy, видимо, не может иметь дело с:
>>> 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
происходит потому, что NumPy, видя тип, что это не знать, как обращаться, по умолчанию вызывает метод sqrt
на объекте; но этого не существует. Так что это не numpy.sqrt
, что не хватает, но long.sqrt
.
С другой стороны, math.sqrt
знает около long
. Если вы собираетесь иметь дело с очень большими числами в NumPy, используйте поплавки, когда это возможно.
EDIT: Хорошо, что вы используете Python 3. В то время как различие между int
и long
has disappeared в этой версии, NumPy по-прежнему чувствителен к разнице между PyLongObject
, который может быть успешно преобразован в C long
с использованием PyLong_AsLong
и тот, который не может.
Узнал что-то новое здесь. Спасибо за сообщение! – mgilson