2017-10-13 1 views
1

편집 ::::: 그래서 x와 y 좌표에 이것을 사용해야합니다. 따라서 DF1에는 5384167 쌍이 있고 DF2에는 1928 쌍이 있습니다.다른 길이의 열에서 변수 간의 절대적인 차이

@Divakar의 솔루션이 하나의 변수에 어떻게 작용하는지 이해합니다. 내 구체적인 경우에는 지하철 좌표가 있으며 범죄 좌표와의 근접성을 비교하고 싶습니다. 가장 가까운 지하철역에서 범죄 유형 및 유클리드 거리와의 상관 관계가 있는지 확인하십시오.

지하철 위치의 모든 X, Y 사이에서 sqrt (DF1 [x] -DF2 [x]) ** 2 + (DF1 [y] -DF2 [y]) ** 2) 범죄 현장의 각 X, Y

범죄 좌표 :

X_COORD_CD Y_COORD_CD 0 1007314.0 241257.0 1 1043991.0 193406.0 2 999463.0 231690.0 3 1060183.0 177862.0 4 987606.0 208148.0

지하철 좌표 :

X_COORD_CD Y_COORD_CD 0 1020671.0 248680.0 1 1019420.0 245867.0 2 1017558.0 245632.0

X_Crime Y_Crime X_Subway Y_Subway Dist_sub1 Dist_sub2 Dist_sub3 1007314 241257 1020671 248680 13356.72213 12105.8096 10243.78646 1043991 193406 1019420 245867 23318.81485 24569.93244 26432.01209 999463 231690 1017558 245632 21207.59944 19956.64481 18094.61475 1060183 177862 39511.10383 40762.16584 42624.20504 987606 208148 33064.38708 31813.40719 29951.37426

그래서 Dist_sub1 [0] = ((X_Crime [0] - X_Subway [0]) ** 2 + (Y_Crime [0] - Y_Subway [0]) ** 2) ** 0.5

Dist_sub2 [3] = ((X_Crime [3] - X_Subway [1]) ** 2 + (Y_Crime [3] - Y_Subway [1]) ** 2) ** 0.5

따라서 최소 거리 범죄 [0] 지하철은 10243.78646 (지하철 [2])입니다. 범죄 [1]은 23318.81485 (지하철 노선 [0])입니다. 범죄 [2]는 18094.61475 (지하철 [2])입니다. 범죄 [3]은 39511.10383 (지하철 노선 [0])입니다. 범죄 [4] I는 두 개의 dataframes에서 x 및 y 좌표의리스트가 EDIT

OF 29951.37426 (지하철 [2])

END이다. 하나는 5384167 개의 항목이 있고 다른 하나에는 1928 개의 항목이 있습니다.

저는 df1과 df2의 각 항목 사이의 절대 거리를 계산하는 방법을 알아 내려고 최소값을 찾습니다. 예 :

DF1 :

x 
1 
2 
3 

DF2 :

x 
4 
5 
6 
7 

내가 매트릭스를 생성 알고 갈 방법이지만 말 그대로 거기에 도착하는 방법을 모르겠어요. 행렬은 다음과 같이 보일 것이다 :

3 2 1 
4 3 2 
5 4 3 
6 5 4 

가 그럼 난 각 열에 대해 최소를 얻을 것 :

3 2 1 
+0

는 당신이 우리의 첫 번째 단계에서 정렬이 /가 예상 출력을 포기하지 않을 어지럽히 샘플 케이스 보여줄 수 있을까요? – Divakar

+0

@Divakar 죄송합니다. 원래 게시물을 편집하고 실제로 각 목록의 실제 샘플을 포함합니다. –

+0

또한 예상 출력을 아직 추가하지 않은 경우 추가하십시오. – Divakar

답변

1

두 가지 방법이 제안 될 수있다.

def abs_min_broadcasting(a, b): # a, b are input arrays 
    return np.abs(a[:,None]-b).min(axis=0) 

output = abs_min_broadcasting(df2.x.values, df1.x.values) 

접근 # 2

또 다른 메모리를 효율적으로 일하고는 빨리 하나는 것 - 무거운 메모리 요구 사항 NumPy broacasting

접근 # 1

한 가지 방법이 될 것입니다 ~로 표시됩니다. np.searchsorted -

012 349,521,643,

샘플 실행 -

In [866]: df1 
Out[866]: 
    x 
0 1 
1 2 
2 3 

In [867]: df2 
Out[867]: 
    x 
0 4 
1 5 
2 6 
3 7 

In [869]: abs_min_broadcasting(df2.x.values, df1.x.values) 
Out[869]: array([3, 2, 1]) 

In [870]: abs_min_searchsorted(df2.x.values, df1.x.values) 
Out[870]: array([3, 2, 1]) 

런타임 테스트 -

In [872]: df1 = pd.DataFrame({'x':np.random.randint(0,100,(10000))}) 

In [873]: df2 = pd.DataFrame({'x':np.random.randint(0,100,(1000))}) 

In [874]: %timeit abs_min_broadcasting(df2.x.values, df1.x.values) 
10 loops, best of 3: 28.4 ms per loop 

In [875]: %timeit abs_min_searchsorted(df2.x.values, df1.x.values) 
1000 loops, best of 3: 663 µs per loop 

In [876]: out1 = abs_min_searchsorted(df2.x.values, df1.x.values) 
    ...: out2 = abs_min_broadcasting(df2.x.values, df1.x.values) 
    ...: print np.allclose(out1, out2) 
    ...: 
True