сумма по оси - PullRequest
       17

сумма по оси

6 голосов
/ 21 августа 2011

Существует ли функция numpy для суммирования массива вдоль (не более) заданной оси?Под осью я подразумеваю нечто эквивалентное:

[x.sum() for x in arr.swapaxes(0,i)].

для суммирования вдоль оси i.

Например, случай, когда numpy.sum не будет работатьнапрямую:

>>> a = np.arange(12).reshape((3,2,2))
>>> a
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])
>>> [x.sum() for x in a] # sum along axis 0
[6, 22, 38]
>>> a.sum(axis=0)
array([[12, 15],
       [18, 21]])
>>> a.sum(axis=1)
array([[ 2,  4],
       [10, 12],
       [18, 20]])
>>> a.sum(axis=2)
array([[ 1,  5],
       [ 9, 13],
       [17, 21]])

Ответы [ 5 ]

3 голосов
/ 08 августа 2014

Начиная с numpy 1.7.1, здесь есть более простой ответ - вы можете передать кортеж аргументу "axis" метода sum для суммирования по нескольким осям.Таким образом, чтобы суммировать все, кроме данного:

x.sum(tuple(j for j in xrange(x.ndim) if j!=i))
3 голосов
/ 22 августа 2011

Вызовите сумму дважды?

In [1]: a.sum(axis=1).sum(axis=1)
Out[1]: array([ 6, 22, 38])

Конечно, было бы немного неудобно обобщать, потому что оси "исчезают". Вам нужно, чтобы оно было общим?

def sum_along(a, axis=0):
    js = [axis] + [i for i in range(len(a.shape)) if i != axis]
    a = a.transpose(js)

    while len(a.shape) > 1: a = a.sum(axis=1)

    return a
2 голосов
/ 27 октября 2015

Вы можете просто передать кортеж с осями, по которым вы хотите суммировать, и пропустить ту, которую вы хотите «суммировать»:

>> a.sum(axis=(1,2))
array([ 6, 22, 38])
2 голосов
/ 12 февраля 2012
np.apply_over_axes(sum, a, [1,2]).ravel()
2 голосов
/ 08 февраля 2012
def sum_along_axis(a, axis=None):
    """Equivalent to [x.sum() for x in a.swapaxes(0,axis)]"""
    if axis is None:
        return a.sum()
    return np.fromiter((x.sum() for x in a.swapaxes(0,axis)), dtype=a.dtype)
...