2011-08-21 22 views
6

¿Hay una función numpy para resumir lo largo de una serie (no más de) un eje dado? Por lo largo de un eje, me refiero a algo equivalente a:suma numpy lo largo del eje

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

En resumen a lo largo del eje I.

Por ejemplo, un caso en el que no va a funcionar numpy.sum directamente: 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]]) 

Respuesta

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

llamada dos veces?

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

Por supuesto, esto sería un poco incómodo de generalizar porque los ejes "desaparecen". ¿Necesitas que sea general?

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

A partir de numpy 1.7.1 hay una respuesta fácil aquí - se puede pasar una tupla con el argumento "eje" del método de la suma de resumir lo largo de múltiples ejes. Así que para resumir sobre todo excepto la dada:

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

puede simplemente pasar una tupla con los ejes que desea sumar más, y dejar de lado el que desea 'suma a lo largo':

>> a.sum(axis=(1,2)) 
array([ 6, 22, 38]) 
Cuestiones relacionadas