2016-10-25 1 views
1

많은 행과 8 개의 열이있는 큰 Numpy 배열 (OriginalArray)이 있습니다. 각 행에 다음과 같은 속성이있는 새 배열 (NewArray)을 만들려고합니다.Python Numpy : N 개의 행마다 다른 열 작업 수행

a) NewArray의 열 1, 3, 5 및 7은 N 행 1, 3, 5 및 7 행의 합계입니다. 및 OriginalArray

b) 컬럼 2, 4, 6, 7 및 NewArray 8은 NewArray 1/N을 가지며, 컬럼 2, 4, 6의 N 개의 행을 통해 평균 등 OriginalArray

8이다 OriginalArray와 같은 행만큼.

예 : N = 2

Original Array = [1 1 1 1 1 1 1 1 
        1 1 1 1 1 1 1 1 
        1 1 1 1 1 1 1 1 
        1 1 1 1 1 1 1 1 ] 

NewArray = [2 1 2 1 2 1 2 1 
      2 1 2 1 2 1 2 1] 

지저분한 서식을 용서하십시오. 나는 아직도 이것 (나의 첫번째 질문, 실제로)에 아주 새롭다.

감사합니다.

+1

지금까지 어떤 시도를 했습니까? 코드 게시! 네가 그것을 달렸을 때 무슨 일이 일어난거야? 대신에 당신은 무엇을 기대 했습니까? 특별히 문제가있는 것은 무엇입니까? – Robert

+0

배열을 다시 모양 짓고 원하는 출력을 얻기 위해 조각을 치고 놀았습니다. 귀하의 의견은 실제로 매우 도움이됩니다. 게시 코드 (그러나 아마추어)는이 사이트를 최대한 활용하는 가장 좋은 방법입니다. 감사! – VivianT

답변

0

많이 사용하는 벡터화 된 접근 방식은 다음과 같습니다.

nrows = a.shape[0]//N # a is input array 
out = np.empty((nrows,8)) 
out[:,::2] = a[:,::2].reshape(-1,N,4).sum(1) 
out[:,1::2] = a[:,1::2].reshape(-1,N,4).mean(1) 

샘플 실행 -

In [64]: a  # Input array 
Out[64]: 
array([[5, 1, 5, 8, 5, 0, 3, 1], 
     [0, 7, 8, 7, 0, 3, 5, 1], 
     [8, 6, 6, 4, 1, 6, 1, 2], 
     [4, 5, 5, 7, 5, 2, 1, 2]]) 

In [65]: N = 2 # Summing/averaging length 

In [66]: a[:,::2] # Select [1,3,5,7] cols 
Out[66]: 
array([[5, 5, 5, 3], 
     [0, 8, 0, 5], 
     [8, 6, 1, 1], 
     [4, 5, 5, 1]]) 

In [67]: a[:,::2].reshape(-1,N,4).sum(1) # Sum N rows by splitting axis 
Out[67]: 
array([[ 5, 13, 5, 8], 
     [12, 11, 6, 2]]) 

In [68]: a[:,1::2] # Select [2,4,6,8] cols 
Out[68]: 
array([[1, 8, 0, 1], 
     [7, 7, 3, 1], 
     [6, 4, 6, 2], 
     [5, 7, 2, 2]]) 

In [69]: a[:,1::2].reshape(-1,N,4).mean(1) # Similarly average across N rows 
Out[69]: 
array([[ 4. , 7.5, 1.5, 1. ], 
     [ 5.5, 5.5, 4. , 2. ]]) 
+0

감사합니다. 이 작동합니다. – VivianT

+0

@VivianT 신난다! 다행 당신을 도울. – Divakar

+0

죄송합니다! 그냥 해냈어. 다시 한번 감사드립니다. – VivianT

0

귀하의 original_array (PEP8 스타일에 유의하십시오)이 이미 행과 열 형식으로되어 있다고 가정합니다. 단순히 행을 복사 한 후

import numpy as np 
row = [np.sum(original_array[:,x]) if x%2==1 else np.mean(test[:,x]) for x in range(len(original_array[0]))] 

을 그리고 : 내 말은 이것에 의해, original_array = np.array([[1,1...],[1,...],[1,...],[1,...]])

쉬운 한 줄은 다음과 같이 될 것이다 new_array의 단일 행을 만들 수

new_array = [row]*N 
+0

감사! 나는 이것을 시도 할 것이다. – VivianT