2017-08-23 3 views
0

Exemple de code avec un NumPy ufunc:numba.vectorize ufunc ne supporte pas timedelta64

import numpy as np 

nums = np.array([1, 2, 3]) 
times = nums.astype('timedelta64[ns]') 

np.less(nums, 2) 
np.less(nums, np.timedelta64(2)) 

Ces deux donnent le même résultat:

array([ True, False, False], dtype=bool) 

Maintenant, je veux faire quelque chose de similaire avec Numba:

import numba 

@numba.vectorize(nopython=True) 
def myless(a, b): 
    return a < b 

myless(nums, 2) 
myless(times, np.timedelta64(2)) # fails 

la première donne le résultat correct, mais la seconde échoue:

TypeError: ufunc 'myless' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Qu'est-ce qui ne va pas? Comment puis-je le réparer?

Répondre

0

J'ai trouvé un indice dans les Numba 0,17 notes de version (qui maintenant est tout à fait une ancienne version):

Issue #917: Allow vectorizing with datetime64 and timedelta64 in the signature (only with unit-less values, though, because of a Numpy limitation).

qui mène à cette comment:

it seems numpy won't less us call ufuncs with non-unitless datetimes and timedeltas, so we're cooked [...]

Donc, apparemment, vous ne pouvez jamais utiliser des ufuncs vectorisés Numba avec NumPy timedelta64 en mode nopython, sauf si le timedelta64 n'a aucune unité spécifiée (dans mon exemple le type de tableau avait [ns] pour les nanosecondes, et même l'ajout des unités au scalaire n'aide pas).

0

Il est seulement une solution de contournement, mais vous pouvez toujours voir zéro copie vos timedeltas comme des entiers (et vice-versa)

In [80]: i8 = np.dtype('int64') 

In [81]: myless(times.view(i8), np.timedelta64(2).view(i8)) 
Out[81]: array([ True, False, False], dtype=bool) 
+1

Ouais, mais qui le rend maladroit sur le site d'appel. Pas bon, parce que les enveloppes pour ufuncs enlèvent toute la magie d'ufunc. Vous ne pouvez pas vraiment cacher le hack n'importe où aussi loin que je peux dire. De plus, vous aurez toujours besoin d'une copie si les unités diffèrent (par exemple en comparant les secondes avec des nanosecondes). –