2011-08-21 18 views
6

Czy istnieje funkcja numpy do sumowania tablicy wzdłuż (nie nad) danej osi? Przez wzdłuż osi, mam na myśli coś, co odpowiada:numpy suma wzdłuż osi

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

podsumować wzdłuż osi I.

Na przykład przypadek, w którym numpy.sum nie będzie działać bezpośrednio: suma

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

Odpowiedz

2
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) 
3

połączenia dwa razy?

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

Oczywiście byłoby trochę niezręcznie uogólniać, ponieważ osie "znikają". Czy chcesz, aby był ogólny?

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
np.apply_over_axes(sum, a, [1,2]).ravel() 
3

Od numpy 1.7.1 jest łatwiejszy odpowiedzi tutaj - można przekazać krotki do „osi” argumentu metody sum na suma po wielu osiach. Więc podsumowując ponad wszystko oprócz danemu:

x.sum(tuple(j for j in xrange(x.ndim) if j!=i)) 
2

można po prostu przejść krotki z osiami, które chcesz podsumować nad i opuścić ten, który ma być „suma wzdłuż”:

>> a.sum(axis=(1,2)) 
array([ 6, 22, 38]) 
Powiązane problemy