修改::::: 所以我需要将它用于x和y坐标。所以DF1有5384167对,DF2有1928对。
我理解@Divakar的解决方案如何适用于一个变量。在我的具体情况下,我有地铁坐标,我想比较它们与犯罪坐标的接近程度。查看与最近的地铁站的犯罪类型和欧几里德距离是否相关。
我知道sqrt(DF1 [x] -DF2 [x])** 2 +(DF1 [y] -DF2 [y])** 2)需要在地铁位置的所有X,Y之间完成犯罪地点的每个X,Y。
犯罪协调员:
$(document).ready(function () {
$("#suggest").autocomplete({
delay: 100,
source: function (request, response) {
// Suggest URL
var catchUrl = "http://55.215.165.15:8086/AutoComplete?prefix=%QUERY";
catchUrl = catchUrl.replace('%QUERY', request.term);
// JSONP Request
$.ajax({
method: 'GET',
dataType: 'jsonp',
jsonpCallback: 'jsonCallback',
url: catchUrl
})
.success(function(data){
response(data[0]);
});
}
});
});
地铁坐标:
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
所以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(Subway [2]);犯罪[1]是23318.81485(Subway [0]);犯罪[2]是18094.61475(Subway [2]);犯罪[3]是39511.10383(Subway [0]);犯罪[4]是29951.37426(地铁[2])
END OF EDIT
我在两个独立的数据框中有一个x和y坐标列表。一个有5384167个条目,另一个有1928个条目。
我正在试图弄清楚如何计算df1和df2中每个条目之间的绝对距离,然后找出最小值。例如:
df1:
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
df2:
x
1
2
3
我知道创建矩阵是可行的方法,但我确实不知道如何到达那里。矩阵看起来像这样:
x
4
5
6
7
然后我会得到每列的最小值:
3 2 1
4 3 2
5 4 3
6 5 4
答案 0 :(得分:1)
可以提出两种方法。
方法#1
具有大量内存要求的NumPy broacasting
的一种方法是 -
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
另一种有效的记忆效应,与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