猿问

函数认为我在浮动

我想计算两个数组中所有坐标对之间的距离。这是我写的一些代码:


def haversine(x,y):

    """

    Calculate the great circle distance between two points 

    on the earth (specified in decimal degrees)

    """

    # convert decimal degrees to radians 

    print(type(x))

    lat1, lon1 = np.radians(x)

    lat2, lon2 = np.radians(y)


    # haversine formula 

    dlon = lon2 - lon1 

    dlat = lat2 - lat1 

    a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2

    c = 2 * np.arcsin(np.sqrt(a)) 

    r = 6371 # Radius of earth in kilometers. Use 3956 for miles

    return c * r


haversine = np.vectorize(haversine)

数组是gas_coords和postal_coords。注意


type(postal_coords)

>>>numpy.ndarray


type(gas_coords)

>>>numpy.ndarray

并且每个数组都有两列。


当我尝试计算距离时using scipy.spatial.distance.cdist,出现以下错误:


in haversine(x, y)

      6     # convert decimal degrees to radians

      7     print(type(x))

---->; 8     lat1,lon1 =np.radians(x)

      9     lat2,lon2 = np.radians(y)

     10 


TypeError: 'numpy.float64' object is not iterable

haversine似乎认为输入x是浮点数而不是数组。即使当我将数组传递给haversine类似haversine(np.zeros(2),np.zeros(2))的对象时,也会出现同样的问题。我应该注意,这仅在通过进行矢量化后发生np.vectorize。


从来看haversine,参数不会以任何方式改变。是什么原因引起的错误?


这是一个最小的工作示例:


import numpy as np

from scipy.spatial.distance import cdist


gas_coords = np.array([[50, 80], [50, 81]])

postal_coords = np.array([[51, 80], [51, 81]])



cdist(postal_coords, gas_coords, metric = haversine)



>>>array([[ 111.19492664,  131.7804742 ],

          [ 131.7804742 ,  111.19492664]])


宝慕林4294392
浏览 130回答 1
1回答

Qyouu

给定所需的输出,可以通过不对haversine函数进行向量化来避免错误,因为这会将标量传递给函数(如上面的注释所述)。因此,您可以致电cdist:import numpy as npfrom scipy.spatial.distance import cdistdef haversine(x, y):    """    Calculate the great circle distance between two points     on the earth (specified in decimal degrees)    """    # convert decimal degrees to radians     print(type(x))    lat1, lon1 = np.radians(x)    lat2, lon2 = np.radians(y)    # haversine formula     dlon = lon2 - lon1     dlat = lat2 - lat1     a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2    c = 2 * np.arcsin(np.sqrt(a))     r = 6371 # Radius of earth in kilometers. Use 3956 for miles    return c * rgas_coords = np.array([[50, 80], [50, 81]])postal_coords = np.array([[51, 80], [51, 81]])cdist(postal_coords, gas_coords, metric=haversine)
随时随地看视频慕课网APP

相关分类

Python
我要回答