Pasar una matriz numpy de dtype np.float64_t
funciona bien (abajo), pero no puedo pasar matrices de cadenas.
Esto es lo que funciona:
# cython_testing.pyx import numpy as np cimport numpy as np ctypedef np.float64_t dtype_t cdef func1 (np.ndarray[dtype_t, ndim=2] A): print A def testing(): chunk = np.array ( [[94.,3.],[44.,4.]], dtype=np.float64) func1 (chunk)
Pero no puedo hacer que esto funcione: no puedo encontrar los ‘identificadores de tipo’ correspondientes a los tipos de cadena numpy.
# cython_testing.pyx import numpy as np cimport numpy as np ctypedef np.string_t dtype_str_t cdef func1 (np.ndarray[dtype_str_t, ndim=2] A): print A def testing(): chunk = np.array ( [['huh','yea'],['swell','ray']], dtype=np.string_) func1 (chunk)
El error de comstackción es:
Error compiling Cython file: ------------------------------------------------------------ ctypedef np.string_t dtype_str_t ^ ------------------------------------------------------------ cython_testing.pyx:9:9: 'string_t' is not a type identifier
ACTUALIZAR
Por mirar a través de numpy.pxd
, veo las siguientes declaraciones de ctypedef
. Tal vez sea suficiente para decir que puedo usar uint8_t
y pretender que todo es normal, siempre que pueda hacer algo de casting.
ctypedef unsigned char npy_uint8 ctypedef npy_uint8 uint8_t
Solo hay que ver lo caro que será ese casting.
Con Cython 0.20.1 funciona usando cdef np.ndarray
, sin especificar el tipo de datos y el número de dimensiones:
import numpy as np cimport numpy as np cdef func1(np.ndarray A): print A def testing(): chunk = np.array([['huh','yea'], ['swell','ray']]) func1(chunk)
Parece que estás fuera de suerte.
http://cython.readthedocs.org/en/latest/src/tutorial/numpy.html
Algunos tipos de datos aún no son compatibles, como matrices booleanas y cadenas de cadenas.
Esta respuesta ya no es válida como lo muestra la respuesta de Saullo Castro, pero la dejaré para propósitos históricos.