2017-10-13 23 views
0

값을 일치시키는 여러 가지 방법을 살펴 봤는데이 경우 가장 좋은 옵션이 무엇인지 잘 모르겠습니다. X, Y, DX, DY :거리 값으로 표의 기존 보정 값 집합 (표에있는)을 일치시킵니다.

-233200.0 -233200.0 -19.4 21.4 
-212000.0 -233200.0 -23.7 23.8 
-190800.0 -233200.0 -26.8 26.4 
-169600.0 -233200.0 -39.0 33.5 
-148400.0 -233200.0 -39.0 33.5 
-127200.0 -233200.0 -46.0 38.4 
-106000.0 -233200.0 -47.2 38.2 
-84800.0 -233200.0 -49.3 38.8 
-63600.0 -233200.0 -50.8 35.8 
-42400.0 -233200.0 -49.4 32.1 

내 두 번째 테이블이 길이 (529)의 유사한 야수 : I 1) 및 입력 표 4 열 및 316 행있는 것을 인덱스 KX 켄터키, KDX을 Kdy는 :

1 -3995 213531 -44.1 32.7 
    2 -25446 213433 -48.6 37.0 
    3 -3175 169047 -44.7 19.7 
    4  -831 40968 -8.7 -15.1 
    5 -2771 147269 -33.1 1.3 
    6 -43705 82864 3.5 -5.3 
    7 -24925 191012 -46.2 30.4 
    8 -25982 236253 -58.1 48.8 
    9 -46318 191012 -48.2 31.2 

목표는 X의 각각에 대해, Y (316 점), I는, 가장 가까운 지점 KX, 켄터키를 찾아 X, Y, DX, DY있는 목록을 반환하고자한다 Kx, Ky, Kdx, Kdy.

내가 함께 316 점 긴 거리 DMIN 만들 수 있습니다 이러한 파일 읽기 : 나는 반환하려고하면,

dmin=[] 
for i in range(len(xf)): 
    for y in range(len(xK)): 
     dist=np.sqrt((x[i]-xK[y])*(x[i]-xK[y])+(y[i]-yK[y])*(y[i]-yK[y])) 
    dmin.append(np.min(dist)) 

그러나이 xK를, YK, dxK, DYK 난 단지 절반을 커버 (316 개) 값을 얻을 범위의 x, y 원본 316 점의 점.

for i in range(len(xf)): 
    for y in range(len(xKnn)): 
     dist=np.sqrt((x[i]-xK[y])*(x[i]-xK[y])+(y[i]-yK[y])*(y[i]-yK[y])) 
    dmin.append(np.min(dist)) 
    ymatch.append(yKnn[i]) 
    xmatch.append(xKnn[i]) 
    dxmatch.append(dxKnn[i]) 
    dymatch.append(dyKnn[i]) 

은 내가 DMIN에 해당하는 경우 KX, 켄터키에서 업데이트 할 인덱스를 쓸 수 있다면 나는 테이블을 조인 수 있기 팬더에 이러는 살펴 보았다. 나는 작은 데이터 프레임에서 dKnn 열을 정의 할 수 있기

d={'x': x, 'y': y, 'dx': dx, 'dy': dy} 
df=pd.DataFrame(data=d) 

dKnn={'xK': xK, 'yK': yK, 'dxK': dxK, 'dyK': dyK} 
dfKnn=pd.DataFrame(data=dKnn) 

그러나, 여기에 내가 문제 다 퉜다.

마지막으로 나는 scipy.spatial.KDTree 루틴을 검색해 왔지만 하나의 배열 만 받아들이도록 설계된 것처럼 일치 된 dxK, dyK를 반환하는 방법을 찾을 수 없었습니다. 팬더 데이터 프레임이 앞으로 가장 희망적인 방법 인 것처럼 보이지만 나는 매우 붙어있어 모든 제안을 환영합니다.

+0

저는 귀하의 문제에 대해 다소 혼란스러워합니다. 당신은 이것에 대해 자세히 설명해 주시겠습니까? 그러나 xK, yK, dxK, dyK를 반환하려고하면 x, y 원본 316 격자의 범위의 절반 만 덮는 316 값을 얻을 수 있습니다. –

답변

0

k 근처의 분류자를 수행하는 것처럼 보입니다. k=1이고 클래스 수는 316 행입니다.

게시자가 게시 한 예제 행 수가 적기 때문에이 예제는 간단하지만 쉽게 확장 할 수 있습니다. 먼저 팬더 데이터 프레임에 데이터를로드하십시오. (당신은 파일에서 읽을 것입니다,하지만이 예제에서는, 나는 그들을 손으로 구성하고 있습니다). scikit는 배우기에서

import pandas as pd 

s1 = '''-233200.0 -233200.0 -19.4 21.4 
-212000.0 -233200.0 -23.7 23.8 
-190800.0 -233200.0 -26.8 26.4 
-169600.0 -233200.0 -39.0 33.5 
-148400.0 -233200.0 -39.0 33.5 
-127200.0 -233200.0 -46.0 38.4 
-106000.0 -233200.0 -47.2 38.2 
-84800.0 -233200.0 -49.3 38.8 
-63600.0 -233200.0 -50.8 35.8 
-42400.0 -233200.0 -49.4 32.1'''.split('\n') 

s2 = ''' 1 -3995 213531 -44.1 32.7 
    2 -25446 213433 -48.6 37.0 
    3 -3175 169047 -44.7 19.7 
    4  -831 40968 -8.7 -15.1 
    5 -2771 147269 -33.1 1.3 
    6 -43705 82864 3.5 -5.3 
    7 -24925 191012 -46.2 30.4 
    8 -25982 236253 -58.1 48.8 
    9 -46318 191012 -48.2 31.2'''.split('\n') 

df1 = pd.DataFrame([list(map(float, x.split())) for x in s1], 
    columns=['x','y','dx','dy']) 

df2 = pd.DataFrame([list(map(float, x.split())) for x in s2], 
    columns=['i','kx','ky','kdx','kdy']) 

이제 우리는 KNeighborsClassifier를 사용할 수 있습니다. 가장 가까운 점에만 관심이 있으므로 k를 1 (n_neighbors=1)로 설정합니다. 행 인덱스를 클래스로 사용하여 첫 번째 데이터 프레임에서 모델을 학습 한 다음 두 번째 데이터 프레임의 점을 예측합니다. 그 후 예측 클래스를 병합하면됩니다.

from sklearn.neighbors import KNeighborsClassifier 

knn = KNeighborsClassifier(n_neighbors=1) 
knn.fit(df1[['x','y']], df1.index) 
closest_index = knn.predict(df2[['kx','ky']]) 

# assign the closest index to df2 
df2['closest_df1'] = closes_index 

# merge the two dataframes, drop the useless columns 
pd.merge(df1, df2, left_index=True, right_on='closest_df1').drop(
    ['i','closest_df1'], axis=1) 

# returns: 
     x   y dx dy  kx  ky kdx kdy 
0 -42400.0 -233200.0 -49.4 32.1 -3995.0 213531.0 -44.1 32.7 
1 -42400.0 -233200.0 -49.4 32.1 -25446.0 213433.0 -48.6 37.0 
2 -42400.0 -233200.0 -49.4 32.1 -3175.0 169047.0 -44.7 19.7 
3 -42400.0 -233200.0 -49.4 32.1 -831.0 40968.0 -8.7 -15.1 
4 -42400.0 -233200.0 -49.4 32.1 -2771.0 147269.0 -33.1 1.3 
5 -42400.0 -233200.0 -49.4 32.1 -43705.0 82864.0 3.5 -5.3 
6 -42400.0 -233200.0 -49.4 32.1 -24925.0 191012.0 -46.2 30.4 
7 -42400.0 -233200.0 -49.4 32.1 -25982.0 236253.0 -58.1 48.8 
8 -42400.0 -233200.0 -49.4 32.1 -46318.0 191012.0 -48.2 31.2 

일치하는 항목이 모두 같은 행에 있기 때문에 여기 출력이 상당히 지루합니다. 그러나 그 아이디어는 효과가 있습니다.