2011-05-17 6 views
20

Runningpython + numpy: dlaczego numpy.log wyświetla błąd atrybutu, jeśli jego operand jest zbyt duży?

np.log(math.factorial(21)) 

zgłasza AttributeError: log. Dlaczego? Mogę sobie wyobrazić ValueError lub jakiś rodzaj UseYourHighSchoolMathsError, ale dlaczego błąd atrybutu?

+4

Przypuszczam, że NumPy najpierw próbuje przekonwertować argument na jeden ze swoich typów skalarnych, a następnie próbuje uzyskać dostęp do jakiegoś specyficznego dla NumPy atrybutu. 'math.factorial (21)' zastępuje rozmiar 'numpy.uint64', więc nie można go przekonwertować na skalar NumPy. Oczywiście NumPy * powinien * rzucić 'ValueError'! –

+0

Zobacz także [AttributeError w python/numpy podczas konstruowania funkcji dla pewnych wartości] (/ questions/18833639/attributeerror-in-python-numpy-when-constructing-function-for-certain-value) – tripleee

Odpowiedz

24

Wynik math.factorial(21) jest długi w języku Python. numpy nie może przekonwertować go na jeden z jego typów numerycznych, więc pozostawia go jako dtype=object. Sposób, w jaki unarowe ufunki działają dla tablic obiektów, polega na tym, że po prostu próbują wywołać metodę o tej samej nazwie na obiekcie. Na przykład.

np.log(np.array([x], dtype=object)) <-> np.array([x.log()], dtype=object) 

Ponieważ nie ma .log() metoda na długi Python, masz AttributeError.

+1

Wow, to wyjaśnia wiele rzeczy –

4

Preferuj funkcję math.log(), która wykonuje zadanie nawet na długich liczbach całkowitych.

Powiązane problemy