2011-08-21 46 views
6

是否有一个numpy函数用于将一个数组(不超过)给定坐标轴相加?通过沿一个轴,我的意思是等价的东西:numpy sum along axis

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

总结沿轴我。两次

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

回答

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

呼叫总和:

例如,情况numpy.sum不会直接工作?

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

作为numpy的1.7.1这里还有一个更简单的答案 - 你可以传递一个元组的总和法多轴总结过的“轴”的说法。所以总结了所有除给定一个:

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

您只需通过与您要总结在轴的元组,并离开了要“和沿”的一个:

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