<p>使用Scipy,您可以定义一个自定义距离函数,如本文<a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html" rel="noreferrer">link</a>中的文档所建议的,并在此处报告,以方便使用:</p>
<blockquote>
<pre><code>Y = pdist(X, f)
</code></pre>
</blockquote>
<pre><code>Computes the distance between all pairs of vectors in X using the user supplied 2-arity function f. For example, Euclidean distance between the vectors could be computed as follows:
dm = pdist(X, lambda u, v: np.sqrt(((u-v)**2).sum()))
</code></pre>
<p>在这里,我报告了我的代码版本,灵感来自于这个<a href="https://sites.google.com/site/dlampetest/python/numpy-array-math" rel="noreferrer">link</a>:</p>
<pre><code>from numpy import sin,cos,arctan2,sqrt,pi # import from numpy
# earth's mean radius = 6,371km
EARTHRADIUS = 6371.0
def getDistanceByHaversine(loc1, loc2):
'''Haversine formula - give coordinates as a 2D numpy array of
(lat_denter link description hereecimal,lon_decimal) pairs'''
#
# "unpack" our numpy array, this extracts column wise arrays
lat1 = loc1[1]
lon1 = loc1[0]
lat2 = loc2[1]
lon2 = loc2[0]
#
# convert to radians ##### Completely identical
lon1 = lon1 * pi / 180.0
lon2 = lon2 * pi / 180.0
lat1 = lat1 * pi / 180.0
lat2 = lat2 * pi / 180.0
#
# haversine formula #### Same, but atan2 named arctan2 in numpy
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))**2 + cos(lat1) * cos(lat2) * (sin(dlon/2.0))**2
c = 2.0 * arctan2(sqrt(a), sqrt(1.0-a))
km = EARTHRADIUS * c
return km
</code></pre>
<p>并以以下方式呼叫:</p>
<pre><code>D = spatial.distance.pdist(A, lambda u, v: getDistanceByHaversine(u,v))
</code></pre>
<p>在我的实现中,矩阵A的第一列是经度值,第二列是纬度值,用十进制度数表示。</p>