2010-07-31 19 views
8

Estoy tratando de escribir algún código de cython para hacer cálculos con matrices numpy. Parece que Cython no le gusta el [] utilizado en todos los ejemplos que he visto para definir el tipo de datos y el número de dimensiones.usando numpy en cython: definiendo ndarray datatype/ndims

Por ejemplo, tengo una test.pyx archivo:

cimport numpy as np 
import numpy as np 

ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix 

cpdef mymatrix hat (mymatrix x): 
    a = np.zeros((3,3)); 
    a[0,1] = x[2,0]; 
    a[0,2] = -x[1,0]; 
    a[1,2] = x[0,0]; 
    a[1,0] = -x[2,0]; 
    a[2,0] = x[1,0]; 
    a[2,1] = -x[0,0]; 
    return a; 

puedo compilar esta usando un setup.py (ver al final del post), que me quedo con "python setup.py build_ext --inplace "

me sale el siguiente resultado:

running build_ext 
cythoning test.pyx to test.c 

Error converting Pyrex file to C: 
------------------------------------------------------------ 
... 
cimport numpy as np 
import numpy as np 

ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix 
             ^
------------------------------------------------------------ 

test.pyx:4:42: Syntax error in ctypedef statement 

<snip, irrelevant> 

mientras que si se quita la "[np.float64_t, Ndim = 2]" parte, que funciona bien.

¿Alguien tiene alguna idea?

En cuanto a mi configuración del sistema: SO: Windows XP

, instalación completa pythonxy completa, la versión 2.6.5.1 (la última en este punto)

pythonxy supuestamente viene con Cython, pero terminó la instalación cython versión 0.12.1 para Python 2.6 desde este sitio: http://www.lfd.uci.edu/~gohlke/pythonlibs/#cython

Sospecho que de alguna manera me falta una ruta o algo así: resolví algunos problemas al agregar explícitamente el directorio numpy header file a la ruta include usada por mingw (ver el archivo setup.py a continuación)

aquí es que el archivo setup.py he mencionado:

from distutils.core import setup 
from distutils.extension import Extension 
from distutils.sysconfig import get_python_inc 
from Cython.Distutils import build_ext 
import os.path 

inc_base = get_python_inc(plat_specific=1); 
incdir = os.path.join(get_python_inc(plat_specific=1),); 

#libraries=['math'], 
ext_modules = [Extension("test", 
["test.pyx"], 
include_dirs = [ 
    os.path.join(inc_base,'..\\Lib\\site-packages\\numpy\\core\\include\\numpy'), 
    ] 
) 
] 

setup(
    name = 'test', 
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = ext_modules 
) 
+0

¿Qué quiere decir con, 'mientras que si se quita la "[np.float64_t, Ndim = 2 ] "parte, funciona bien". ¿Acabas de reemplazar 'mymatrix' con' np.ndarray [np.float64_t, ndim = 2' en los dos lugares donde ocurre? –

+1

No creo que puedas usar la interfaz del buffer con ctypedef. Debes declararlo cada vez con cdef. – carl

Respuesta

3

Ponga la información de tipo en la declaración de la función, como en:

def hat (ndarray[np.float64_t, ndim=2] x): 
    a = np.zeros((3,3)); 
    a[0,1] = x[2,0]; 
    etc. 
0

creo que usted no puede hacerlo directamente: usted tiene que comprobar la forma y el tipo de la función

assert x.shape[0] == 2 
assert x.dtype == np.float64 

y sólo cdeftype np.ndarray mymatrix en el encabezado

PERO usted pierde el tipeo de los valores de matriz , por lo tanto, tiene que asignar cada valor que procesa a float64_t: pero ¿cuál debería ser la eficiencia?

Louis