Si te sientes cómodo con numba permite crear un cortocircuito rápido (se detiene tan pronto como se encuentra un NaN) función:
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
Si no hay, NaN
la función podría ser más lenta que np.min
, creo que se debe a que np.min
usa multiprocesamiento para matrices grandes:
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
Pero en caso de que haya un NaN en la matriz, especialmente si su posición está en índices bajos, entonces es mucho más rápido:
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
Se pueden lograr resultados similares con Cython o una extensión de C, estos son un poco más complicados (o fácilmente disponibles como bottleneck.anynan
) pero en última instancia hacen lo mismo que mi anynan
función.