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
)
¿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? –
No creo que puedas usar la interfaz del buffer con ctypedef. Debes declararlo cada vez con cdef. – carl