что точно выполняет numpy.apply_along_axis? - PullRequest
14 голосов
/ 26 января 2012

Я натолкнулся на функцию numpy.apply_along_axis в некотором коде. И я не понимаю документации об этом.

Это пример документации:

>>> 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]])

Насколько я понял документацию, я ожидал:

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

т.е.. применив функцию вдоль оси [1,2,3] , которая является осью 0 в [[1,2,3], [4,5,6], [7 , 8,9]]

Очевидно, я не прав. Не могли бы вы поправить меня?

Ответы [ 2 ]

13 голосов
/ 26 января 2012

apply_along_axis применяет предоставленную функцию к 1D срезам входного массива, причем срезы берутся вдоль указанной вами оси. Итак, в вашем примере new_func применяется к каждому срезу массива вдоль первой оси. Это становится понятнее, если вы используете векторную функцию, а не скаляр, например:

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]])

Здесь numpy.diff применяется вдоль каждого среза первой или второй оси (размера) входного массива.

4 голосов
/ 26 января 2012

Функция выполняется на 1-м массиве вдоль оси = 0.Вы можете указать другую ось, используя аргумент "axis".Эта парадигма используется следующим образом:

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

Функция была выполнена на каждом подмассиве вдоль измерения 0. Таким образом, она предназначена для одномерных функций и возвращает одномерный массив для каждого одномерного входа.1004 *

Другой пример:

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

Предоставляет скалярный вывод для одномерного массива.Конечно, вы могли бы просто установить параметр оси в cumsum или sum для выполнения вышеизложенного, но суть в том, что он может использоваться для любой написанной вами 1-D функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...