Sto provando a scrivere del codice cython per fare calcoli con gli array numpy. Sembra che a Cython non piaccia il [] utilizzato in tutti gli esempi che ho visto per definire il tipo di dati e il numero di dimensioni.usando numpy in cython: definizione di ndarray datatype/ndims
Ad esempio, ho un file test.pyx:
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;
posso compilare questo utilizzando un setup.py (vedi fine del post), che corro con "python setup.py build_ext --inplace "
ottengo il seguente output:
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>
mentre se rimuovo "[np.float64_t, Ndim = 2]" parte, funziona benissimo.
Qualcuno ha qualche idea?
quanto riguarda la mia configurazione del sistema: OS: Windows XP
completa, installazione completa pythonxy, versione 2.6.5.1 (l'ultima a questo punto)
pythonxy presumibilmente dotato Cython, ma ho finito per l'installazione Cython versione 0.12.1 per Python 2.6 da questo sito: http://www.lfd.uci.edu/~gohlke/pythonlibs/#cython
ho il sospetto che in qualche modo mi manca un percorso o qualcosa del genere: ho risolto alcuni problemi con l'aggiunta in modo esplicito la directory di file di intestazione numpy al percorso utilizzato da includere mingw (vedi il file setup.py sotto)
qui è che il file setup.py ho detto:
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
)
Che cosa si intende per, 'che, se mi tolgo la "[np.float64_t, Ndim = 2 ] "parte, funziona bene?" Stai semplicemente sostituendo 'mymatrix' con' np.ndarray [np.float64_t, ndim = 2' nei due punti in cui si verifica? –
Non penso che tu possa usare l'interfaccia buffer con ctypedef. Devi dichiararlo ogni volta con cdef. – carl