2014-11-06 4 views
6

я написал следующую функцию в cython для оценки журнала правдоподобияValueError: ndarray не C-смежный в Cython

@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 

, но когда я запускаю скомпилированную версию этой функции, я получаю следующее сообщение об ошибке:

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

Я не мог понять, почему эта проблема возникает ?? !!! Буду признателен за полезные советы.

+0

Это полный источник? Может быть добавлено 'cimport numpy as np' поможет вам? –

+0

@ С.Козлов, конечно же, нет! Это длинный код, и я отправил часть кода, которая вызывает сообщение об ошибке. – Dalek

+0

@ S.Kozlov Действительно, он находится на вершине длинного кода. – Dalek

ответ

11

Перед тем, как вы получите сообщение об ошибке, попробуйте напечатать атрибут flags массива numpy, который вы передаете likelihood. Вы, вероятно, увидеть что-то вроде:

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

Примечания, где он говорит C_CONTIGUOUS : False, потому что это вопрос. Чтобы исправить это, просто преобразуйте его в C-порядке:

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 
Смежные вопросы