Jeśli czujesz się komfortowo z numba pozwala na stworzenie szybkiego zwarcia (zatrzymuje się po znalezieniu NaN) funkcja:
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
Jeśli nie ma NaN
funkcji, może być wolniejsza niż np.min
, myślę, że to dlatego, że np.min
używa przetwarzania wieloprocesowego dla dużych tablic:
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
Ale jeśli w tablicy znajduje się NaN, zwłaszcza jeśli jego pozycja znajduje się na niskich indeksach, jest to znacznie szybsze:
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
Podobne wyniki można osiągnąć z Cythonem lub rozszerzeniem C, są one nieco bardziej skomplikowane (lub łatwo dostępne bottleneck.anynan
), ale ostatecznie robią to samo, co moja anynan
funkcja.