2010-07-31 9 views
8

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

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? –

+1

Non penso che tu possa usare l'interfaccia buffer con ctypedef. Devi dichiararlo ogni volta con cdef. – carl

risposta

3

Mettere le informazioni sul tipo nella dichiarazione della funzione, come in:

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

penso che non è possibile farlo direttamente: si controlla la forma e il tipo nella funzione

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

e solo cdeftype np.ndarray mymatrix nell'intestazione

MA si perde la digitazione dei valori di matrice , quindi è necessario assegnare ogni valore elaborato a float64_t: ma quale dovrebbe essere l'efficienza?

Louis