Мне нужно написать функцию, которая будет определять, содержит ли вход хотя бы одно не числовое значение. Если не числовое значение будет найдено, я выдам ошибку (потому что вычисление должно возвращать только числовое значение). Количество измерений входного массива заранее неизвестно - функция должна давать правильное значение независимо от 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