Cómo pasar una matriz numpy de tipos de cadena a una función en Cython

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.