özellikle kullanışlı bir Simple wrapping of C code with cython olmanın bu sitede Cython içinde numpy kullanmayla ilgili birçok soru vardır. Bununla birlikte, özellikle bellek bitişik dizilerinin geçirilmesini sağlayarak, cyton/numpy arabirimi api seems to have changed a bit, özellikle de .Geçme ve Cython
o Cython bir sarmalayıcı işlevi yazmak için en iyi yolu nedir:
- muhtemel ancak mutlaka bitişik olmayan bir numpy dizi alır
- imza
double* data_in, double* data_out
- ile bir C++ sınıfı yöntemini çağırır Yöntemin yazdığı
double*
numpy dizisini döndürür?
Benim deneyin aşağıdaki gibidir:
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)
Bu kod derler ama ille optimal değildir. Yukarıdaki snippet'i iyileştirme konusunda herhangi bir öneriniz var mı?
ve
X_c = ...
tanımlı değildir" atar ve. kesin test kodu ve hata iletisi aşağıdaki gibidir: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!
"numpy modülü hakkında özel derleme zamanı bilgisi almak için kullanılır"] (http://docs.cython.org/src/tutorial/numpy.html#adding-types)). – jorgeca
@jorgeca Yorumunuzun OP sorusuna cevap verdiğini tahmin ediyorum ... –
@SaulloCastro Bir yorum olarak gönderdim çünkü küçük bir engel olduğunu düşündüm, ancak bu arayüzleri yazmanın en iyi yolunun ne olduğunu bilmiyorum. – jorgeca