2016-11-05 3 views
2

Matlab의 smooth 함수는 기본적으로 5 포인트 이동 평균을 사용하여 데이터를 부드럽게합니다. 파이썬에서 동일한 작업을 수행하는 가장 좋은 방법은 무엇입니까? 예를 들어 이 내 데이터가MatLAB의 NumPy/Python 원활한 구현 (n- 포인트 이동 평균)

0 
0.823529411764706 
0.852941176470588 
0.705882352941177 
0.705882352941177 
0.676470588235294 
0.676470588235294 
0.500000000000000 
0.558823529411765 
0.647058823529412 
0.705882352941177 
0.705882352941177 
0.617647058823529 
0.705882352941177 
0.735294117647059 
0.735294117647059 
0.588235294117647 
0.588235294117647 
1 
0.647058823529412 
0.705882352941177 
0.764705882352941 
0.823529411764706 
0.647058823529412 
0.735294117647059 
0.794117647058824 
0.794117647058824 
0.705882352941177 
0.676470588235294 
0.794117647058824 
0.852941176470588 
0.735294117647059 
0.647058823529412 
0.647058823529412 
0.676470588235294 
0.676470588235294 
0.529411764705882 
0.676470588235294 
0.794117647058824 
0.882352941176471 
0.735294117647059 
0.852941176470588 
0.823529411764706 
0.764705882352941 
0.558823529411765 
0.588235294117647 
0.617647058823529 
0.647058823529412 
0.588235294117647 
0.617647058823529 
0.647058823529412 
0.794117647058824 
0.823529411764706 
0.647058823529412 
0.617647058823529 
0.647058823529412 
0.676470588235294 
0.764705882352941 
0.676470588235294 
0.647058823529412 
0.705882352941177 
0.764705882352941 
0.705882352941177 
0.500000000000000 
0.529411764705882 
0.529411764705882 
0.647058823529412 
0.676470588235294 
0.588235294117647 
0.735294117647059 
0.794117647058824 
0.852941176470588 
0.764705882352941 

평활화 된 데이터가

0 
0.558823529411765 
0.617647058823530 
0.752941176470588 
0.723529411764706 
0.652941176470588 
0.623529411764706 
0.611764705882353 
0.617647058823530 
0.623529411764706 
0.647058823529412 
0.676470588235294 
0.694117647058824 
0.700000000000000 
0.676470588235294 
0.670588235294118 
0.729411764705882 
0.711764705882353 
0.705882352941177 
0.741176470588235 
0.788235294117647 
0.717647058823529 
0.735294117647059 
0.752941176470588 
0.758823529411765 
0.735294117647059 
0.741176470588235 
0.752941176470588 
0.764705882352941 
0.752941176470588 
0.741176470588235 
0.735294117647059 
0.711764705882353 
0.676470588235294 
0.635294117647059 
0.641176470588236 
0.670588235294118 
0.711764705882353 
0.723529411764706 
0.788235294117647 
0.817647058823530 
0.811764705882353 
0.747058823529412 
0.717647058823530 
0.670588235294118 
0.635294117647059 
0.600000000000000 
0.611764705882353 
0.623529411764706 
0.658823529411765 
0.694117647058824 
0.705882352941176 
0.705882352941176 
0.705882352941176 
0.682352941176471 
0.670588235294118 
0.676470588235294 
0.682352941176471 
0.694117647058824 
0.711764705882353 
0.700000000000000 
0.664705882352941 
0.641176470588236 
0.605882352941177 
0.582352941176471 
0.576470588235294 
0.594117647058824 
0.635294117647059 
0.688235294117647 
0.729411764705882 
0.747058823529412 
0.803921568627451 
0.764705882352941 

이를 얻을 수 매트랩 구문은 내가에서 동일한 작업을 수행 할

smooth(data) 

입니다해야하는 경우 파이썬하지만이 일을 할 수있는 기능을 찾을 수 없습니다.

+0

이 질문을 http://stackoverflow.com/questions/13728392/moving-average-or-과 동일 - 따라서

, 우리는 일반적인 창 크기,과 같이 처리 할 수있는 구현을 할 것이다 러닝 - 평균? –

+0

@BillBell 전 여기에 – rsnaveen

+0

이 다른 예제라고 생각하지 않습니다 : http://scipy-cookbook.readthedocs.io/items/SignalSmooth.html – Moritz

답변

9

MATLAB의 smoooth func은 길이가 5 인 슬라이딩 윈도우에서 평균화와 기본적으로 동일하지만 양끝에서 2 개의 elems를 처리하는 방식은 다릅니다. 링크 된 문서에 따라, 그 경계의 경우는이 공식으로 계산된다 - 그래서, NumPy와/파이썬에서 동일한 구현을 복제 할

yy = smooth(y) smooths the data in the column vector y .. 
The first few elements of yy are given by 

yy(1) = y(1) 
yy(2) = (y(1) + y(2) + y(3))/3 
yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5 
yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5 
... 

을, 우리는 슬라이딩 윈도우 합산을 얻기를 위해 NumPy's 1D convolution를 사용하고 창 길이를 나눌 수 있습니다 우리에게 평균 결과를 알려주세요. 그런 다음 경계 요소에 대한 특수 사례 처리 값을 간단히 추가하십시오.

def smooth(a,WSZ): 
    # a: NumPy 1-D array containing the data to be smoothed 
    # WSZ: smoothing window size needs, which must be odd number, 
    # as in the original MATLAB implementation 
    out0 = np.convolve(a,np.ones(WSZ,dtype=int),'valid')/WSZ  
    r = np.arange(1,WSZ-1,2) 
    start = np.cumsum(a[:WSZ-1])[::2]/r 
    stop = (np.cumsum(a[:-WSZ:-1])[::2]/r)[::-1] 
    return np.concatenate(( start , out0, stop )) 
+0

고맙습니다 @Divakar. 하지만 'smooth'함수를 사용하려고하면 다음과 같은 오류가 발생합니다. 'AttributeError :'list '객체에'cumsum '속성이 없습니다. – rsnaveen

+0

@rsnaveen NumPy 배열로'a'라고 가정하고 있습니다. 배열과 목록 모두를 처리하도록 수정되었습니다. – Divakar

+0

@Divakar 감사합니다. – rsnaveen