2013-09-03 31 views
6

Hãy nói rằng tôi có các mảng sau:tổng bộ phận của numpy.array

a = np.array([[1,2,3,4,5,6], 
       [7,8,9,10,11,12], 
       [3,5,6,7,8,9]]) 

Tôi muốn tổng hợp hai giá trị đầu tiên của dòng đầu tiên: 1+2 = 3, sau đó hai giá trị tiếp theo: 3+4 = 7, và sau đó 5+6 = 11, và cứ tiếp tục cho mỗi hàng. đầu ra mong muốn của tôi là thế này:

array([[ 3, 7, 11], 
     [15, 19, 23], 
     [ 8, 13, 17]]) 

tôi có giải pháp sau đây:

def sum_chunks(x, chunk_size): 
    rows, cols = x.shape 
    x = x.reshape(x.size/chunk_size, chunk_size) 
    return x.sum(axis=1).reshape(rows, cols/chunk_size) 

Nhưng nó cảm thấy quá phức tạp, là có một cách tốt hơn? Có lẽ một built-in?

Trả lời

5

Khi tôi phải thực hiện loại công cụ này, tôi muốn định lại lại mảng 2D thành mảng 3D, sau đó thu gọn kích thước bổ sung bằng np.sum. Tổng quát nó thành mảng n-chiều, bạn có thể làm một cái gì đó như thế này:

def sum_chunk(x, chunk_size, axis=-1): 
    shape = x.shape 
    if axis < 0: 
     axis += x.ndim 
    shape = shape[:axis] + (-1, chunk_size) + shape[axis+1:] 
    x = x.reshape(shape) 
    return x.sum(axis=axis+1) 

>>> a = np.arange(24).reshape(4, 6) 
>>> a 
array([[ 0, 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10, 11], 
     [12, 13, 14, 15, 16, 17], 
     [18, 19, 20, 21, 22, 23]]) 
>>> sum_chunk(a, 2) 
array([[ 1, 5, 9], 
     [13, 17, 21], 
     [25, 29, 33], 
     [37, 41, 45]]) 
>>> sum_chunk(a, 2, axis=0) 
array([[ 6, 8, 10, 12, 14, 16], 
     [30, 32, 34, 36, 38, 40]]) 
1

Dưới đây là một cách:

>>> a[:,::2] + a[:,1::2] 
array([[ 3, 7, 11], 
     [15, 19, 23], 
     [ 8, 13, 17]]) 
5

Chỉ cần sử dụng cắt:

a[:,::2] + a[:,1::2] 

này có các mảng hình thành bởi mỗi cột thậm chí lập chỉ mục (::2), và thêm nó vào mảng hình thành bởi mỗi cột được lập chỉ mục lẻ (1::2).

+0

Cảm ơn bạn, cắt hoạt động tốt cho trường hợp "2", nhưng nó vẫn sẽ là tốt đẹp cho một giải pháp chung? – Akavall

+0

Bạn sẽ khái quát hóa điều này như thế nào? Bạn có thể làm 'np.sum ([a [:, i :: n] cho i trong xrange (n)], 0)' nếu bạn có thể cần tổng các cột liên tiếp 'n', ví dụ. – nneonneo

+0

Giải pháp của bạn ngắn hơn và dễ đọc hơn, nhưng tôi đã hẹn giờ và giải pháp ban đầu của tôi nhanh hơn đáng kể. – Akavall

Các vấn đề liên quan