Pasar una matriz numpy de dtype np.float64_t
funciona bien (abajo), pero no puedo pasar las matrices de cadenas.Cómo pasar una matriz numpy de tipos de cadenas a una función en Cython
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 puede hacer este trabajo: no puedo encontrar las emparejamiento '' identificadores de tipo de cadena dtypes 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 compilació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
ACTUALIZACIÓN
por mirando a través de numpy.pxd
, veo los ctypedef
declaraciones siguientes. Tal vez eso es suficiente para decir que puedo usar uint8_t
y pretender que todo es normal, siempre y cuando pueda hacer algo de casting.
ctypedef unsigned char npy_uint8
ctypedef npy_uint8 uint8_t
Solo tenemos que ver qué tan caro será el vaciado.
Gracias. He votado a favor su respuesta. Aunque espero que haya una solución al usar quizás la matriz Numpy Structured [http://docs.scipy.org/doc/numpy/user/basics.rec.html#structured-arrays]. Pero todavía estoy buscando cómo pasar uno de esos también. – HeyWatchThis
Al menos para mis propósitos, usando cProfile, parece que todavía puede pasar matrices Numpy sin escribir, en Cython. Pero no obtiene las optimizaciones de Cython descritas en su referencia readthedocs.org. – HeyWatchThis
Ser capaz de usarlos lentamente aún es mejor que no poder usarlos en absoluto, ¿verdad? – JAB