2017-11-22 5 views
0

이것은 중복 질문 일 수 있지만 필요한 정확한 해결책을 찾을 수 없습니다.NumPy 배열의 N 행 합계

모든 N 개의 행 (이 예에서는 4 개)을 합산하려고합니다. 그래서 8 by 9 행렬에서 2 행 9 열, 즉 행 0-3을 합친 다음 4-7 행을 합산합니다. 지금 당장은 이것이 내가 가진 해결책이지만 목록 이해력을 사용하지 않는 방법이 있습니까? 이 작업을 수행하는 데 "numpy"한 방법이 있습니까? 왜냐하면 단일 2 x 9 배열이 아닌 2 1 x 9 배열의 목록으로 끝나기 때문입니다.

입력 배열이 8x9로 고정되어 있지 않으면 12x9 또는 28x9가 될 수 있지만 입력 배열의 총 행 수가 항상 N의 정수 배가됩니다 어떤 및 N = 예 8 4)

>>> import numpy as np 
>>> a = np.arange(72).reshape(8,9) 
>>> 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, 24, 25, 26], 
    [27, 28, 29, 30, 31, 32, 33, 34, 35], 
    [36, 37, 38, 39, 40, 41, 42, 43, 44], 
    [45, 46, 47, 48, 49, 50, 51, 52, 53], 
    [54, 55, 56, 57, 58, 59, 60, 61, 62], 
    [63, 64, 65, 66, 67, 68, 69, 70, 71]]) 

>>> b = [a[i:(i+1)*4,:] for i in range(0,len(a),4)] 

>>> b 
    [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, 24, 25, 26], 
    [27, 28, 29, 30, 31, 32, 33, 34, 35]]), 
    array([[36, 37, 38, 39, 40, 41, 42, 43, 44], 
    [45, 46, 47, 48, 49, 50, 51, 52, 53], 
    [54, 55, 56, 57, 58, 59, 60, 61, 62], 
    [63, 64, 65, 66, 67, 68, 69, 70, 71]])] 

>>> b = [np.sum(a[i:(i+1)*4,:],axis=0) for i in range(0,len(a),4)] 

>>> b 

>>>[array([54, 58, 62, 66, 70, 74, 78, 82, 86]), array([198, 202, 206, 210, 
    214, 218, 222, 226, 230])] 

답변

1

모양 변경 후자 축 우리 후 3D 배열을주는 윈도우 길이 = 4 동일한 길이가되도록 두 내로 제 1 축 분할 그와 같이 합계 -

a.reshape(-1,4,a.shape[-1]).sum(1) 

이것은 일반 모양의 배열에서 작동합니다. hat -1을 reshaping 메서드에서 사용합니다. split/reshaped 버전의 첫 번째 축을 따라 길이가 계산되므로 일반적인 솔루션을 제공합니다.

샘플 실행은 명확 물건을 만들려면 - bFig8 @

# Input array with 8 rows 
In [15]: a = np.arange(72).reshape(8,9) 

# Get output shape 
In [16]: a.reshape(-1,4,a.shape[-1]).sum(1).shape 
Out[16]: (2, 9) 

# Input array with 28 rows 
In [17]: a = np.arange(28*9).reshape(28,9) 

# Get output shape 
In [18]: a.reshape(-1,4,a.shape[-1]).sum(1).shape 
Out[18]: (7, 9) 
3
In [120]: a 
Out[120]: 
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, 24, 25, 26], 
     [27, 28, 29, 30, 31, 32, 33, 34, 35], 
     [36, 37, 38, 39, 40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49, 50, 51, 52, 53], 
     [54, 55, 56, 57, 58, 59, 60, 61, 62], 
     [63, 64, 65, 66, 67, 68, 69, 70, 71]]) 

In [121]: a.reshape((2, 4, 9)).sum(axis=1) 
Out[121]: 
array([[ 54, 58, 62, 66, 70, 74, 78, 82, 86], 
     [198, 202, 206, 210, 214, 218, 222, 226, 230]]) 
+0

당신이 행의 수는 다를 것이라고 언급 한대로, 당신의 일반적인 모양의 배열을 작동해야합니다. – Divakar

+0

네가 맞습니다! 내 게시물을 업데이트합니다. – bFig8

+0

@ bFig8 그 이유는 제 솔루션 (솔루션의 차이점)에서 일반적인 솔루션에 대해'-1'을 사용했기 때문입니다. – Divakar