2012-01-26 20 views
9

Me he encontrado con la función numpy.apply_along_axis en algún código. Y no entiendo la documentación al respecto.¿Qué hace numpy.apply_along_axis?

Este es un ejemplo de la documentación:

>>> def new_func(a): 
...  """Divide elements of a by 2.""" 
...  return a * 0.5 
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]]) 
>>> np.apply_along_axis(new_func, 0, b) 
array([[ 0.5, 1. , 1.5], 
     [ 2. , 2.5, 3. ], 
     [ 3.5, 4. , 4.5]]) 

Por lo I como pensaba que entendía la documentación, que habría esperado:

array([[ 0.5, 1. , 1.5], 
     [ 4 , 5 , 6 ], 
     [ 7 , 8 , 9 ]]) 

es decir, después de haber aplicado la función a lo largo del eje [1,2,3] que es el eje en [[1,2,3], [4,5,6], [7,8,9]]

Obviamente estoy equivocado. ¿Podrías corregirme?

Respuesta

9

apply_along_axis aplica la función suministrada a lo largo de las divisiones 1D de la matriz de entrada, con las divisiones tomadas a lo largo del eje que especifique. Por lo tanto, en su ejemplo, se aplica new_func sobre cada porción del conjunto a lo largo del primer eje. Se vuelve más clara si se utiliza una función vectorial valioso, en lugar de un escalar, así:

In [20]: b = np.array([[1,2,3], [4,5,6], [7,8,9]]) 

In [21]: np.apply_along_axis(np.diff,0,b) 
Out[21]: 
array([[3, 3, 3], 
     [3, 3, 3]]) 

In [22]: np.apply_along_axis(np.diff,1,b) 
Out[22]: 
array([[1, 1], 
     [1, 1], 
     [1, 1]]) 

Aquí, numpy.diff se aplica a lo largo de cada rebanada de la primera o segunda eje (dimensión) de la matriz de entrada.

2

La función se realiza en matrices de 1-d a lo largo del eje = 0. Puede especificar otro eje utilizando el argumento "eje". Un uso de este paradigma es:

np.apply_along_axis(np.cumsum, 0, b) 

La función se realizó en cada subconjunto a lo largo de dimensión 0. Por lo tanto, se entiende para las funciones de 1D y devuelve una matriz 1D para cada entrada 1D.

Otro ejemplo es:

np.apply_along_axis(np.sum, 0, b) 

proporciona una salida escalar para una matriz de 1-D. Por supuesto, puede establecer el parámetro de eje en cumsum o sum para hacer lo anterior, pero el punto aquí es que se puede usar para cualquier función 1-D que escriba.