2017-10-13 1 views
1

編集::::: だから私はこれをx座標とy座標に使用する必要があります。したがって、DF1は5384167ペア、DF2は1928ペアです。異なる長さの列の変数間の絶対差

私は@Divakarのソリューションが1つの変数に対してどのように機能するのか理解しています。具体的には私は地下鉄の座標系を持っていますので、犯罪座標との近さを比較したいと思います。最も近い地下鉄駅からの犯罪とユークリッド距離のタイプとの相関があるかどうかを確認してください。

地下鉄の場所にあるすべての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]私は2つの別々のデータフレーム内のx座標とy座標のリストを持っているEDIT

OF 29951.37426(地下鉄[2])

ENDです。 1つは5384167のエントリを持ち、もう1つは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

別のメモリ効率の良い1としては、例えば、高速一方が希望 - 重いメモリ要件とNumPy broacasting

アプローチ#1

一つのアプローチは次のようになり〜であることnp.searchsorted -

def abs_min_searchsorted(a, b): # a, b are input arrays 
    a_s = np.sort(a) # skip this if already sorted 
    lidx = np.searchsorted(a_s,b).clip(max=len(a_s)-1) 
    ridx = (lidx-1).clip(min=0) 
    return np.minimum(np.abs(a_s[lidx] - b), np.abs(a_s[ridx] - b)) 

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

サンプル実行 -

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 
関連する問題