2015-11-04 21 views
0

如何在Cython中定義datetime64[D]timedelta[D]bool_ dtypes?在cython中使用datetime和bool

假設我有

cimport cython 
cimport numpy as np 
import numpy as np 
from numpy cimport ndarray as ar 

cpdef myfunc(...): 
    cdef: 
     ar[double] my_float_var 
     ar[np.int64] my_int_var 
     ar[??] my_datetime64_var 
     ar[??] my_bool_var 

感謝

回答

2

不能與這些類型直接在C級互動,但你可以與他們從視圖中工作。例如:

In [59]: import pandas as pd 

In [60]: a = pd.date_range('2014-1-1', periods=10).values 

In [61]: b = np.array([True, True, False, False, False, True, True, False, False, False]) 

In [62]: c = np.array([pd.Timedelta(days=1).asm8 for _ in range(10)]) 

In [63]: %%cython 
    ...: cimport numpy as np 
    ...: def func(np.ndarray[np.int64_t] dates, 
    ...:   np.ndarray[np.uint8_t] bools, 
    ...:   np.ndarray[np.int64_t] deltas): 
    ...:  cdef: 
    ...:   int i, N = len(dates) 
    ...:  for i in range(N): 
    ...:   if bools[i]: 
    ...:    dates[i] += deltas[i] 
    ...:  return dates.view('M8[ns]') 

In [65]: func(a.view('int64'), b.view('uint8'), c.view('int64')) 
Out[65]: 
array(['2014-01-01T18:00:00.000000000-0600', 
     '2014-01-02T18:00:00.000000000-0600', 
     '2014-01-02T18:00:00.000000000-0600', 
     '2014-01-03T18:00:00.000000000-0600', 
     '2014-01-04T18:00:00.000000000-0600', 
     '2014-01-06T18:00:00.000000000-0600', 
     '2014-01-07T18:00:00.000000000-0600', 
     '2014-01-07T18:00:00.000000000-0600', 
     '2014-01-08T18:00:00.000000000-0600', 
     '2014-01-09T18:00:00.000000000-0600'], dtype='datetime64[ns]')