получить максимум абсолюта по оси - PullRequest
0 голосов
/ 06 июля 2018

У меня есть пара ndarrays с одинаковой формой, и я хотел бы получить один массив (одинаковой формы) с максимумом абсолютных значений для каждого элемента. Поэтому я решил сложить все массивы, а затем выбрать значения вдоль новой сложенной оси. Но как это сделать?

Пример

Скажем, у нас есть два одномерных массива по 4 элемента в каждом, поэтому мой составной массив выглядит как

>>> stack
array([[ 4,  1,  2,  3],
       [ 0, -5,  6,  7]])

Если бы меня заинтересовал максимум, что я мог бы сделать

>>> numpy.amax(stack, axis=0)
array([4, 1, 6, 7])

Но мне нужно учитывать и отрицательные значения, поэтому я выбрал

>>> ind = numpy.argmax(numpy.absolute(stack), axis=0)
>>> ind
array([0, 1, 1, 1])

Так что теперь у меня есть индексы, которые мне нужны, но как применить это к массиву с накоплением? Если я просто индексирую stack по ind, numpy делает что-то, что мне не нужно:

>>> stack[ind]
array([[ 4,  1,  2,  3],
       [ 0, -5,  6,  7],
       [ 0, -5,  6,  7],
       [ 0, -5,  6,  7]])

То, что я хочу получить, это array([4, -5, 6, 7])

Или спросить с несколько иной точки зрения: как мне получить массив numpy.amax(stack, axis=0) на основе индексов, возвращаемых numpy.argmax(stack, axis=0)?

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Если у вас двумерный нудистый ndarray, классическая индексация больше не применяется. Таким образом, чтобы достичь того, чего вы хотите, чтобы избежать brodcatsting, вы должны индексировать и двумерный массив:

>>> stack[[ind,np.arange(stack.shape[1])]]
array([ 4, -5,  6,  7])
0 голосов
/ 06 июля 2018

Для «нормального» Python:

>>> a=[[1,2],[3,4]]
>>> b=[0,1]
>>> [x[y] for x,y in zip(a,b)]
[1, 4]

Возможно, это применимо и к array s, я недостаточно знаком с Numpy.

0 голосов
/ 06 июля 2018

Операция суммирования будет неэффективной. Мы можем просто использовать np.where, чтобы сделать выбор на основе абсолютных сравнений -

In [198]: a
Out[198]: array([4, 1, 2, 3])

In [199]: b
Out[199]: array([ 0, -5,  6,  7])

In [200]: np.where(np.abs(a) > np.abs(b), a, b)
Out[200]: array([ 4, -5,  6,  7])

Это работает с универсальными массивами n-dim без каких-либо изменений.

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