ValueError: ndarray n'est pas C contigus dans cython
J'ai écrit la fonction suivante dans cython
pour estimer le la log-vraisemblance
@cython.boundscheck(False)
@cython.wraparound(False)
def likelihood(double m,
double c,
np.ndarray[np.double_t, ndim=1, mode='c'] r_mpc not None,
np.ndarray[np.double_t, ndim=1, mode='c'] gtan not None,
np.ndarray[np.double_t, ndim=1, mode='c'] gcrs not None,
np.ndarray[np.double_t, ndim=1, mode='c'] shear_err not None,
np.ndarray[np.double_t, ndim=1, mode='c'] beta not None,
double rho_c,
np.ndarray[np.double_t, ndim=1, mode='c'] rho_c_sigma not None):
cdef double rscale = rscaleConstM(m, c,rho_c, 200)
cdef Py_ssize_t ngals = r_mpc.shape[0]
cdef np.ndarray[DTYPE_T, ndim=1, mode='c'] gamma_inf = Sh(r_mpc, c, rscale, rho_c_sigma)
cdef np.ndarray[DTYPE_T, ndim=1, mode='c'] kappa_inf = Kap(r_mpc, c, rscale, rho_c_sigma)
cdef double delta = 0.
cdef double modelg = 0.
cdef double modsig = 0.
cdef Py_ssize_t i
cdef DTYPE_T logProb = 0.
#calculate logprob
for i from ngals > i >= 0:
modelg = (beta[i]*gamma_inf[i] / (1 - beta[i]*kappa_inf[i]))
delta = gtan[i] - modelg
modsig = shear_err[i]
logProb = logProb -.5*(delta/modsig)**2 - logsqrt2pi - log(modsig)
return logProb
mais quand je lance la version compilée de cette fonction, j'obtiens le message d'erreur suivant:
File "Tools.pyx", line 3, in Tools.likelihood
def likelihood(double m,
ValueError: ndarray is not C-contiguous
Je ne pouvais tout à fait comprendre pourquoi ce problème se produit??!!! Je vous en seront reconnaissants pour obtenir tous les conseils utiles.
- Est-il plein de la source? Peut-être ajouter de
cimport numpy as np
serait-il vous aider? - bien sûr, il ne l'est pas! C'est un long code, et j'ai posté la partie de code qui génère l'erreur de message.
- En effet, c'est sur le haut de la longue code.
Vous devez vous connecter pour publier un commentaire.
Juste avant vous obtenez le message d'erreur, essayez d'imprimer le
flags
attribut du tableau numpy(s) vous êtes de passage àlikelihood
. Vous verrez probablement quelque chose comme:Note où il est dit
C_CONTIGUOUS : False
, parce que c'est la question. Pour le fixer, il suffit de le convertir en C-ordre: