2011-08-21 16 views
6

क्या किसी दिए गए धुरी (ओवर नहीं) के साथ एक सरणी को समेटने के लिए कोई संख्यात्मक कार्य है? एक धुरी के साथ, मैं करने के लिए कुछ बराबर मतलब है:धुरी के साथ numpy sum

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