Я пытаюсь векторизовать функцию, которая выполняет некоторые операции с некоторыми координатами, но также зависит от времени. Время представляется в виде массива 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 не поддерживается?