Muszę napisać funkcję, która będzie wykrywać, czy dane wejściowe zawierają co najmniej jedną wartość nienumeryczną. Jeśli zostanie znaleziona wartość nieliczbowa, zgłoszę błąd (ponieważ obliczenia powinny zwracać tylko wartość liczbową). Liczba wymiarów tablicy wejściowej nie jest z góry znana - funkcja powinna podawać poprawną wartość niezależnie od ndim. Dodatkową komplikacją może być pojedyncza liczba zmiennoprzecinkowa numpy.float64
lub nawet coś dziwnego, jak tablica zerowymiarowa.
Oczywistym sposobem rozwiązania tego problemu jest napisanie funkcji rekurencyjnej, która wykonuje iterację po każdym iterowalnym obiekcie w tablicy, dopóki nie znajdzie elementu, który nie jest iterabem. Zastosuje numpy.isnan()
funkcję do każdego obiektu, którego nie można iterować. Jeśli zostanie znaleziona co najmniej jedna wartość nieliczbowa, funkcja natychmiast zwróci False. W przeciwnym razie, jeśli wszystkie wartości w iterowalnej są liczbowe, ostatecznie zwróci True.
Działa to dobrze, ale jest dość powolne i spodziewam się, że NumPy ma o wiele lepszy sposób na zrobienie tego. Jaka jest alternatywa, która jest szybsza i bardziej otępiała?
Oto moja makieta:
def contains_nan( myarray ):
"""
@param myarray : An n-dimensional array or a single float
@type myarray : numpy.ndarray, numpy.array, float
@returns: bool
Returns true if myarray is numeric or only contains numeric values.
Returns false if at least one non-numeric value exists
Not-A-Number is given by the numpy.isnan() function.
"""
return True
array(['None', 'None'], dtype=object)
? Czy takie wejście powinno powodować tylko wyjątek?
float('nan') in x
. To nie działa.
contains_nan
wygląda podejrzanie: „Zwraca fałsz, jeśli istnieje co najmniej jedna wartość nieliczbowa”. Spodziewałbymcontains_nan
się powrotu,True
jeśli tablica zawiera NaN.