Evaluación eficiente de una función en cada celda de una matriz NumPy

Dada una matriz NumPy A , ¿cuál es la forma más rápida / eficiente de aplicar la misma función, f , a cada celda?

  1. Supongamos que asignamos a A (i, j) la f (A (i, j)) .

  2. La función, f , no tiene una salida binaria, por lo tanto, las operaciones de enmascaramiento (ing) no ayudarán.

¿Es la iteración de bucle doble “obvia” (a través de cada celda) la solución óptima?

Puede simplemente vectorizar la función y luego aplicarla directamente a una matriz Numpy cada vez que la necesite:

import numpy as np def f(x): return x * x + 3 * x - 2 if x > 0 else x * 5 + 8 f = np.vectorize(f) # or use a different name if you want to keep the original f result_array = f(A) # if A is your Numpy array 

Probablemente sea mejor especificar un tipo de salida explícito directamente al vectorizar:

 f = np.vectorize(f, otypes=[np.float]) 

Una pregunta similar es: asignar una matriz NumPy en su lugar . Si puede encontrar un ufunc para su f (), entonces debe usar el parámetro de salida.

Si está trabajando con números f(A(i,j)) = f(A(j,i)) , puede usar scipy.spatial.distance.cdist que define f como una distancia entre A(i) y A(j) .