Мені потрібно написати функцію, яка буде визначати, чи вхід містить принаймні одне значення, яке не є числовим. Якщо знайдено нечислове значення, я підніму помилку (оскільки обчислення має повернути лише числове значення). Кількість розмірів вхідного масиву не відома заздалегідь - функція повинна дати правильне значення незалежно від ndim. В якості додаткового ускладнення вхідним сигналом може бути одиночний поплавок numpy.float64
або навіть щось незвичайне, як нульовий масив.
Очевидний спосіб вирішити це - записати рекурсивну функцію, яка перебирається над кожним ітерабельним об'єктом у масиві, поки не знайде неітераб. Він застосує numpy.isnan()
функцію до кожного неітерабельного об'єкта. Якщо знайдено хоча б одне нечислове значення, функція негайно поверне значення False. В іншому випадку, якщо всі значення в ітерабелі будуть числовими, вони з часом повернуть True.
Це працює чудово, але це досить повільно, і я думаю, що у NumPy є набагато кращий спосіб зробити це. Що є альтернативою, яка швидша і більш нумерована?
Ось мій макет:
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)
? Чи повинен такий внесок викликати виключення?
float('nan') in x
. Це не працює.
contains_nan
виглядає підозрілою: "Повертає помилку, якщо існує хоча б одне нечислове значення". Я б очікувавcontains_nan
повернення,True
якщо масив містить NaN.