¿Hay algo que pueda hacer para acelerar las matrices enmascaradas en numpy? Tenía una función terriblemente ineficiente que volví a escribir para utilizar matrices enmascaradas (donde podía simplemente enmascarar filas en lugar de hacer copias y eliminar filas como lo hacía). Sin embargo, me sorprendí al descubrir que la función enmascarada era 10 veces más lenta porque las matrices enmascaradas son mucho más lentas.Python/Numpy - Las matrices enmascaradas son muy lentas
Como ejemplo, tome las siguientes (enmascarado es más de 6 veces más lento para mí):
import timeit
import numpy as np
import numpy.ma as ma
def test(row):
return row[0] + row[1]
a = np.arange(1000).reshape(500, 2)
t = timeit.Timer('np.apply_along_axis(test, 1, a)','from __main__ import test, a, np')
print round(t.timeit(100), 6)
b = ma.array(a)
t = timeit.Timer('ma.apply_along_axis(test, 1, b)','from __main__ import test, b, ma')
print round(t.timeit(100), 6)
Tenga en cuenta que las MaskedArrays son más convenientes que una solución real. Si necesita realizar cálculos intensivos en matrices de matrices con valores faltantes o indefinidos, en la mayoría de los casos, es mejor tratar con la máscara y los datos usted mismo. Hasta que se mejore la implementación de los valores faltantes o indefinidos en el código de NumPy (lo que debería suceder pronto), usted quedará atrapado en MaskedArrays. Sí, son bastante lentos, porque están codificados en Python puro, lo que por supuesto no puede ser tan eficiente como confiar en algún código C. –
Gracias por la pregunta, esto confirma lo que sospechaba de mi código –