2013-03-13 4 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 что здесь происходит? math.sqrt, похоже, не имеет такой же проблемы.Странное поведение np.sqrt для больших целых чисел

+4

Узнал что-то новое здесь. Спасибо за сообщение! – mgilson

ответ

8

Конечное число является 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 и longhas disappeared в этой версии, NumPy по-прежнему чувствителен к разнице между PyLongObject, который может быть успешно преобразован в C long с использованием PyLong_AsLong и тот, который не может.

+1

Но, но, но это не объясняет 'AttributeError' ... Как это случайно удаляет' sqrt' из пространства имен numpy? Это должно быть ошибкой ... – mgilson

+0

@mgilson: Я добирался до этого :) –

+0

(я уверен, что это причина ошибки btw - Но это очень странная ошибка) – mgilson

Смежные вопросы