2017-08-23 1 views
0

Beispielcode mit einem NumPy ufunc unterstützt:numba.vectorize ufunc nicht 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)) 

Beide denen das gleiche Ergebnis:

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

Jetzt möchte ich etwas ähnliches mit Numba tun:

import numba 

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

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

die erste gibt das korrekte Ergebnis, aber die zweite nicht:

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''

Was ist los? Wie kann ich es reparieren?

Antwort

0

fand ich einen Hinweis in den Release Notes Numba 0,17 (die nun durch eine recht alte Version):

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

die comment zu dieser führt:

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

Sie können also offenbar nicht immer Verwenden Sie Numba vectorized ufuncs mit NumPy timedelta64 im nopython-Modus, es sei denn, die timedelta64 hat keine Einheiten angegeben (in meinem Beispiel hatte der Array-Typ [ns] für Nanosekunden, und selbst das Hinzufügen der Einheiten zum Skalar hilft nicht).

0

Es ist nur ein Problem zu umgehen, aber man kann immer Null-Kopie Ihrer timedeltas als ganze Zahlen sehen (und umgekehrt)

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

Ja, aber, dass es an der Aufrufstelle umständlich macht. Nicht gut, weil Wrapper für Ufuncs all die Magie von Ufunc entfernen. Sie können den Hack nicht wirklich verstecken, soweit ich das beurteilen kann. Außerdem benötigen Sie immer noch eine Kopie, wenn sich die Einheiten unterscheiden (z. B. Sekunden mit Nanosekunden vergleichen). –

Verwandte Themen