Numba - использовать массив datetime в подписи guvectorize - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь векторизовать функцию, которая выполняет некоторые операции с некоторыми координатами, но также зависит от времени. Время представляется в виде массива numpy объектов даты и времени. Это код:

@guvectorize(['(float64[:,:], np.datetime64[:],float64[:,:])'], '(m,n),(n),(m,n) ->(m,n)')
def jit_qdrdistspd(data, dates, result):

"""
    Calculate heading, distance and speed using just-in-time compilation and vectorization
    In: data [np.array] array containing information about lat, lon, alt, dates
                        format: [lat, lon, alt, date
                                 lat, lon, alt, date
                                 ...]
    Out: result [np.array] array containging result of calculation
"""
for i in range(data.shape[0]-1):
    lat1 = data[i,0]
    lat2 = data[i+1,0]
    lon1 = data[i,1]
    lon2 = data[i+1,1]
    alt1 = data[i,2]
    alt2 = data[i+1,2]
    date1 = dates[i]
    date2 = dates[i+1]

    res1 = jit_rwgs84(0.5 * (latd1 + latd2))

    # res2 :different hemisphere
    a    = 6378137.0       # [m] Major semi-axis WGS-84
    r1   = rwgs84(latd1)
    r2   = rwgs84(latd2)
    res2 = 0.5 * (abs(latd1) * (r1 + a) + abs(latd2) * (r2 + a)) / \
        (abs(latd1) + abs(latd2))

    # Condition
    sw   = (latd1 * latd2 >= 0.)

    r    = sw * res1 + (1 - sw) * res2

    lat1 = np.radians(latd1)
    lon1 = np.radians(lond1)
    lat2 = np.radians(latd2)
    lon2 = np.radians(lond2)

    sin1 = np.sin(0.5 * (lat2 - lat1))
    sin2 = np.sin(0.5 * (lon2 - lon1))

    coslat1 = np.cos(lat1)
    coslat2 = np.cos(lat2)

    root = sin1 * sin1 + coslat1 * coslat2 * sin2 * sin2
    d    =  2.0 * r * np.arctan2(np.sqrt(root) , np.sqrt(1.0 - root))
    d = d/nm
    #    d =2.*r*np.arcsin(np.sqrt(sin1*sin1 + coslat1*coslat2*sin2*sin2))

    # Bearing from Ref. http://www.movable-type.co.uk/scripts/latlong.html

    qdr = np.degrees(np.arctan2(np.sin(lon2 - lon1) * coslat2,
        coslat1 * np.sin(lat2) - np.sin(lat1) * coslat2 * np.cos(lon2 - lon1)))

    dt = date2-date1
    dt =  dt / np.timedelta64(1, 's')
    cas = 3600.0 / (dt * d)
    lin_vs = dt * (alt2 - alt1)
    vs = 60.0/lin_vs if lin_vs > 0 else 0.0


    result[i,:] = np.array([qdr, d, cas, vs])

Моя проблема заключается в указании в подписи, что ожидается массив datetime. Я пробовал несколько способов, включая написание datetime, types.datetime, NPDatetime вместо np.datetime64, но ни один из них не работает, т.е. я получаю разные ошибки, и код не компилируется.

Есть ли способ сделать это, или datetime в guvectorize не поддерживается?

...