2017-12-22 7 views
1

이것은 빠른 방법입니다. 더 나은 (짧은 루프를 사용 외에) 다음 줄을 표현하는 방법이 있는지 궁금 :특정 계단 크기를 가진 2D 배열의 행 합계 - NumPy

energy = np.zeros((4, signal.shape[1])) 
energy[0::4, 0:] = np.sum(signal[0::4, :], axis=0) 
energy[1::4, 0:] = np.sum(signal[1::4, :], axis=0) 
energy[2::4, 0:] = np.sum(signal[2::4, :], axis=0) 
energy[3::4, 0:] = np.sum(signal[3::4, :], axis=0) 

답변

1

모양 변경은 두 가지로 첫 번째 축을 분할 다음과 같이,이 두의 첫 따라 합계를이 -

energy = signal.reshape(-1,4,signal.shape[1]).sum(0) 

샘플 실행 - 반드시 행 수와 배열에 대한

In [327]: np.random.seed(0) 

In [328]: signal = np.random.randint(0,9,(8,5)) 

In [329]: energy = np.zeros((4, signal.shape[1])) 
    ...: energy[0::4, 0:] = np.sum(signal[0::4, :], axis=0) 
    ...: energy[1::4, 0:] = np.sum(signal[1::4, :], axis=0) 
    ...: energy[2::4, 0:] = np.sum(signal[2::4, :], axis=0) 
    ...: energy[3::4, 0:] = np.sum(signal[3::4, :], axis=0) 

In [330]: energy 
Out[330]: 
array([[ 13., 4., 6., 3., 10.], 
     [ 8., 5., 4., 7., 15.], 
     [ 7., 11., 11., 4., 13.], 
     [ 7., 8., 8., 5., 12.]]) 

In [331]: signal.reshape(-1,4,signal.shape[1]).sum(0) 
Out[331]: 
array([[13, 4, 6, 3, 10], 
     [ 8, 5, 4, 7, 15], 
     [ 7, 11, 11, 4, 13], 
     [ 7, 8, 8, 5, 12]]) 

여러 4의 일반 버전은 다음과 같습니다.

m = signal.shape[0] 
n = m//4 
energy = signal[:n*4].reshape(n,4,-1).sum(0) 
energy[:m%4] += signal[n*4:] 
+0

와우, 빠른 속도로 중요한 부분입니다. 고맙습니다 :) – sonovice