NumPy: применить функцию выбора индекса к нескольким осям - PullRequest
3 голосов
/ 06 сентября 2011

Я пишу код для оптимизации количеств, которые зависят от переменного количества параметров.Для оптимизации я хотел бы применить функции выбора индекса, такие как numpy.argmax и numpy.argmin, по нескольким осям одновременно.Ниже приведен код, который я использую прямо сейчас.Существует ли более встроенный или эффективный подход для выполнения этой задачи по произвольному количеству осей, которые могут или не могут быть последовательными?

def nd_arg_axes(func, array, start):
    """Applies an index selecting function over trailing axes from start."""

    n_trail = len(array.shape[start:])  # Number of trailing axes to apply to.

    indices = np.zeros((n_trail,)+array.shape[:start], dtype=np.intp)
    for i in np.ndindex(array.shape[:start]):
        indices[(Ellipsis,)+i] = np.unravel_index(func(array[i]),
                                               array.shape[start:])
    return tuple(indices)

# Test showing nd_arg_axes does indeed return the correct indices.
array = np.arange(27).reshape(3,3,3)
max_js = nd_arg_axes(np.argmax, array, 1)

(array[tuple(np.indices(array))+max_js] ==
np.squeeze(np.apply_over_axes(np.amax, array, axes=[1,2])))

1 Ответ

2 голосов
/ 06 сентября 2011

Если вы выбираете задние оси, вы можете изменить задние оси на -1 и применить функцию к оси = -1:

def f(func, array, start):
    shape = array.shape
    tmp = array.reshape(shape[:start] + (-1,))
    indices = func(tmp, axis=-1)
    return np.unravel_index(indices, shape[start:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...