2013-09-03 2 views
6

Скажем, у меня есть следующий массив:сумма частей numpy.array

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

Я хочу, чтобы подвести первые два значения первой строки: 1+2 = 3, затем следующие два значения: 3+4 = 7, а затем 5+6 = 11, и т. д. для каждой строки. Мой желаемый результат заключается в следующем:

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

У меня есть следующее решение:

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) 

Но он чувствует себя излишне сложным, есть лучший способ? Возможно, встроенный?

ответ

5

Когда мне нужно делать такие вещи, я предпочитаю преобразовать 2D-массив в 3D-массив, а затем свернуть дополнительный размер с помощью np.sum. Обобщая его п-мерные массивы, вы могли бы сделать что-то вроде этого:

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

Вот один из способов:

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

Просто используйте нарезку:

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

Это принимает массив, образованный каждый четные индексированный столбец (::2), и добавляет его в массив, образованном каждый столбца с нечетным индексом (1::2).

+0

Спасибо, нарезка работает хорошо для «2» случая, но будет все еще быть хорошо для общего решения? – Akavall

+0

Как бы вы это обобщили? Вы можете сделать 'np.sum ([a [:, i :: n] для i в xrange (n)], 0)', если вам, возможно, потребуется суммировать последовательные столбцы 'n', например. – nneonneo

+0

Ваше решение короче и легче читать, но я приурочил его, и мои первоначальные решения значительно быстрее. – Akavall

Смежные вопросы