ValueError: ndarray is not C-contiguous in cython

I wrote the following function in cython to evaluate the log likelihood

 @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 

but when I run the compiled version of this function, the following error message appears:

  File "Tools.pyx", line 3, in Tools.likelihood def likelihood(double m, ValueError: ndarray is not C-contiguous 

I could not understand why this problem occurs ?? !!! I would be grateful for the helpful advice.

+6
source share
1 answer

Before you get an error message, try printing the flags attribute of the numpy array, which you pass to likelihood . You will probably see something like:

 In [2]: foo.flags Out[2]: C_CONTIGUOUS : False F_CONTIGUOUS : True OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False 

Notice where C_CONTIGUOUS : False is written because this is a problem. To fix this, just convert it to C-order:

 In [6]: foo = foo.copy(order='C') In [7]: foo.flags Out[7]: C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False 
+11
source

Source: https://habr.com/ru/post/977826/


All Articles