Суммирование по всем, кроме одной оси - PullRequest
0 голосов
/ 26 июня 2018

Несколько раз я имел дело с массивом ND, например

foo = np.arange(27).reshape((3,3, 3))

и тогда у меня будет измерение, в котором я хочу сохранить переменную из следующей операции. Скажем, следующая операция mean, в этом случае

preserveAxis = 1
desiredOutcome = foo.mean(axis=0).mean(axis=1)

предыдущий - мой желаемый результат, так как я сначала беру среднее по 0-ой оси, а затем по 2-ой оси (которая стала 1-ой после начальной операции). То есть Я проделал операцию над осями 0 и 2, но сохранил ось 1 .

Этот тип процедур является громоздким и, что важнее всего, не общим. Я ищу общий способ сохранить одну ось, но суммировать / означать по всем остальным. Как я могу достичь этого лучше, предпочтительно в пределах numpy?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вот один обобщенный на n-dim случай для сокращения ufuncs -

def reduce_skipfew(ufunc, foo, preserveAxis=None):
    r = np.arange(foo.ndim)   
    if preserveAxis is not None:
        preserveAxis = tuple(np.delete(r, preserveAxis))
    return ufunc(foo, axis=preserveAxis)

Пробный прогон -

In [171]: reduce_skipfew(np.mean, foo, preserveAxis=1)
Out[171]: array([10., 13., 16.])

In [172]: foo = np.arange(27).reshape((3,3, 3))

In [173]: reduce_skipfew(np.mean, foo, preserveAxis=1)
Out[173]: array([10., 13., 16.])

In [174]: reduce_skipfew(np.sum, foo, preserveAxis=1)
Out[174]: array([ 90, 117, 144])

# preserve none i.e. sum all
In [175]: reduce_skipfew(np.sum, foo, preserveAxis=None)
Out[175]: 351

# preserve more than one axis
In [176]: reduce_skipfew(np.sum, foo, preserveAxis=(0,2)) 
Out[176]: 
array([[ 9, 12, 15],
       [36, 39, 42],
       [63, 66, 69]])
0 голосов
/ 26 июня 2018

Вы можете использовать кортежи для параметра оси:

foo.mean(axis=(0, 2))

Если ваш массив имеет переменное число измерений и / или сохраняемое измерение может варьироваться, это может быть немного сложнее. См. Ответ @ Divakar.

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