2012-06-12 17 views
15

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.

Respuesta

7

Parece que está de enhorabuena.

http://cython.readthedocs.org/en/latest/src/tutorial/numpy.html

Algunos tipos de datos aún no son compatibles, como matrices booleanas y matrices de cadenas.


esta pregunta ya no es válida, como se muestra por la respuesta de Saullo Castro, pero lo dejaré para fines históricos.

+0

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

+1

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

+1

Ser capaz de usarlos lentamente aún es mejor que no poder usarlos en absoluto, ¿verdad? – JAB

6

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) 
+0

@TedPetrou Estoy intentando construir un ejemplo donde el 'dtype = object' se aceleraría para actualizar la respuesta, pero hasta ahora me parecía equivalente a no especificar' dtype'. ¿Cómo midió la velocidad de 100 veces? –

+0

Parece que me equivoqué masivamente en mi comentario anterior. Parece que obtengo una mejora de 5x cambiando a objeto. Usa esta matriz 'a = np.array (['some', 'strings', 'in', 'an', 'array'] * 10 ** 5)' –

Cuestiones relacionadas