Если тебе комфортно с Numba он позволяет создать функцию быстрого короткого замыкания (останавливается, как только будет найдено NaN):
import numba as nb
import math
@nb.njit
def anynan(array):
array = array.ravel()
for i in range(array.size):
if math.isnan(array[i]):
return True
return False
Если нет, NaN
функция может быть медленнее, чем np.min
, я думаю, это потому, что np.min
для больших массивов используется многопроцессорность:
import numpy as np
array = np.random.random(2000000)
%timeit anynan(array) # 100 loops, best of 3: 2.21 ms per loop
%timeit np.isnan(array.sum()) # 100 loops, best of 3: 4.45 ms per loop
%timeit np.isnan(array.min()) # 1000 loops, best of 3: 1.64 ms per loop
Но если в массиве есть NaN, особенно если его позиция имеет низкие индексы, тогда это намного быстрее:
array = np.random.random(2000000)
array[100] = np.nan
%timeit anynan(array) # 1000000 loops, best of 3: 1.93 µs per loop
%timeit np.isnan(array.sum()) # 100 loops, best of 3: 4.57 ms per loop
%timeit np.isnan(array.min()) # 1000 loops, best of 3: 1.65 ms per loop
Аналогичные результаты могут быть достигнуты с помощью Cython или расширения C, они немного сложнее (или легко доступны bottleneck.anynan
), но в конечном итоге делают то же самое, что и моя anynan
функция.