2011-08-21 23 views
6

Có chức năng numpy để tổng hợp một mảng dọc theo (không quá) một trục nhất định không? Bởi cùng một trục, ý tôi là một cái gì đó tương đương với:tổng gumpy dọc theo trục

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

để tổng hợp cùng trục i.

Ví dụ, một trường hợp numpy.sum sẽ không làm việc trực tiếp:

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

Trả lời

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

Gọi tổng hai lần?

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

Tất nhiên, điều này sẽ hơi khó xử khi khái quát vì trục "biến mất". Bạn có cần nó nói chung không?

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

Tính đến NumPy 1.7.1 có một câu trả lời dễ dàng hơn ở đây - bạn có thể vượt qua một tuple vào "trục" đối số của phương pháp tổng hợp để tổng hợp trên nhiều trục. Vì vậy, để tổng hợp trên tất cả ngoại trừ một đưa ra:

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

Bạn chỉ có thể vượt qua một tuple với các trục mà bạn muốn tổng hợp kết thúc, và bỏ qua những một mà bạn muốn 'tổng hợp cùng':

>> a.sum(axis=(1,2)) 
array([ 6, 22, 38]) 
Các vấn đề liên quan