2017-03-28 8 views
1

파이썬에서 문제를 발견하는 데 문제가 있음 (현재 시차 코드에 대한 책임이 있음).x 값이 평평하게 될 때를 기준으로 한 단계 함수 배열을 청크하는 방법

배열이 있는데, x라고 부릅니다. y 축이 일반적인 값, x 축 인 X의 줄거리는, 배열의 인덱스 같습니다

y-axis is generic value, x-axis is index of array

내가 (다음 그림 참조 초기 범프 후 평면 부분을 분리되고 싶지 내가)에 관심이 있음 :

chunks I am interested in

내가 최고의 평면 라인을 무시하고 범프, 나는

같은 뭔가를하도록 두 번째 이미지에서 5 개 개의 빨간 상자의 배열을 만들고 싶어 엑스 _chunk = [상자 0], [상자 1], [상자 2], [상자 3], [상자 4]

빨간색 청크 사이의 모든 경사 선을 무시하고 싶습니다. 적절한 반복 과정을 알아 내고 내가 필요한 것을 얻을 수 있도록 조건을 설정하는 데 문제가 있습니다.

답변

0

그래서, 이것은 깨끗한 솔루션은 아마하지 않습니다, 그러나 그것은 작동 :

Example data

# Find maximum and start from there 
idxStart=np.argmax(y) 
y2=y[idxStart:] 

# Grab jump indices 
idxs=np.where(np.diff(y2)<-1)[0]+1 

# Put into boxes 
boxs=[] 
for i in range(len(idxs)-1): 
    boxs.append(y2[idxs[i]:idxs[i+1]]) 

print boxs 

물론 당신이 필요합니다 :

import numpy as np 
import matplotlib.pyplot as plt 

# Create data 
r=np.random.random(50) 
y1 = np.array([50,40,30,20,10]) 
y=np.repeat(y1,10) 
y[9]=y[9]+10 
y=y+r 

# Plot data 
x=np.arange(len(y)) 
plt.plot(x,y) 
plt.show() 

당신이 뭔가를 줄 것이다 데이터의 "점프/드랍"을 구별 할 수있는 정확한 임계 값을 찾으십시오. 내 경우에 -1이 충분 했으므로 random이 반환됩니다. 0과 1 사이의 값. 시차로 인한 피로가 빨리 개선되기를 바랍니다.

0

나는 데이터가없는, 그러나이 같은 창 및 임계 값으로 놀러 할 수 있습니다

def findSteps(arr, thr=.02, window=10, disc=np.std): 
    d = disc(np.lib.stride_tricks.as_strided(arr, strides = arr.strides*2, shape = (arr.size-window+1, window)), axis = 1) 
    m = np.minimum(np.abs(d[:-window]), np.abs(d[window:])) < thr 
    i = np.nonzero(np.diff(m)) 
    return np.split(arr[window:-window], i)[::2] 

작동합니다, 당신은 discnp.std 경우에 대한 기울기 함수를 작성 할 수 있으므로 테스트되지 않음 작동하지 않지만 기본적인 생각은 앞뒤로 window 걸음 걸음을 걷고 보폭의 표준 편차 (또는 기울기)가 0에 가까워 지는지 확인합니다.

블록 수는 True이고,의 시작과 끝을 찾을 수 있습니다.

그런 다음 np.split 블록을 기준으로 배열 목록에 배열을 지정하고 나머지 하위 배열은 전환이되므로 목록의 다른 모든 멤버 만 가져옵니다.

+0

응답 해 주셔서 감사합니다. 나는 np.std와 scipy.optimize.curve_fit의 매개 변수를 사용하여 직선을 맞추고 기울기를 최소화하려고 생각하고있었습니다. 나는 slide_tricks 함수를 인식하지 못했고, 그 문서가별로 좋지는 않지만, 배열을 나눌 깔끔한 트릭이 될 것 같다. 간단한 질문 중 하나 : 왜 할 m = np.minimum (np.abs (d [: - window]), np.abs (d [window :])) Marty

+0

대부분 마지막 단계에서 마지막 'window' 데이터 포인트를 놓치지 않도록해야합니다. 'abs'는'np.std'를 경사 함수로 대체 할 경우를 대비 한 것입니다. –