Ci sono molte domande sull'utilizzo di numpy in cython su questo sito, particolarmente utile per Simple wrapping of C code with cython.Passaggio e restituzione di array numpy a metodi C++ tramite Cython
Tuttavia, l'interfaccia cython/numpy api seems to have changed a bit, in particolare per garantire il passaggio di array di memoria contigui.
Qual è il modo migliore per scrivere una funzione wrapper in Cython che:
- prende una matrice NumPy che è probabile, ma non necessariamente contigui
- chiama un metodo di classe C++ con la firma
double* data_in, double* data_out
- restituisce una matrice numpy di
double*
a cui il metodo ha scritto?
La mia prova è qui sotto:
cimport numpy as np
import numpy as np # as suggested by jorgeca
cdef extern from "myclass.h":
cdef cppclass MyClass:
MyClass() except +
void run(double* X, int N, int D, double* Y)
def run(np.ndarray[np.double_t, ndim=2] X):
cdef int N, D
N = X.shape[0]
D = X.shape[1]
cdef np.ndarray[np.double_t, ndim=1, mode="c"] X_c
X_c = np.ascontiguousarray(X, dtype=np.double)
cdef np.ndarray[np.double_t, ndim=1, mode="c"] Y_c
Y_c = np.ascontiguousarray(np.zeros((N*D,)), dtype=np.double)
cdef MyClass myclass
myclass = MyClass()
myclass.run(<double*> X_c.data, N, D, <double*> Y_c.data)
return Y_c.reshape(N, 2)
Questo codice viene compilato, ma non è necessariamente ottimale. Hai qualche suggerimento su come migliorare lo snippet qui sopra?
e (2) tiri e "np non è definito sulla riga X_c = ...
") quando lo si chiama in fase di esecuzione. Il codice di test e messaggio di errore esatto sono i seguenti:
import numpy as np
import mywrapper
mywrapper.run(np.array([[1,2],[3,4]], dtype=np.double))
# NameError: name 'np' is not defined [at mywrapper.pyx":X_c = ...]
# fixed!
Hai ancora a 'importazione NumPy come np' nel file' .pyx' per utilizzare le funzioni di Numpy ('cimport NumPy come np' [ "è usato per importare speciali informazioni in fase di compilazione sul modulo numpy"] (http://docs.cython.org/src/tutorial/numpy.html#adding-types)). – jorgeca
@jorgeca Immagino che il tuo commento risponda alla domanda OP ... –
@SaulloCastro L'ho postato come commento perché pensavo fosse un ostacolo minore, ma non so quale sia il modo migliore per scrivere queste interfacce. – jorgeca