2014-11-06 14 views
6

Tôi đã viết các chức năng sau đây trong cython để ước tính logaValueError: ndarray không phải là C tiếp giáp trong 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 

nhưng khi tôi chạy phiên bản biên dịch của chức năng này, tôi nhận được thông báo lỗi sau:

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

Tôi không thể hiểu tại sao vấn đề này xảy ra ?? !!! Tôi sẽ đánh giá cao để có được bất kỳ lời khuyên hữu ích.

+0

Có phải là nguồn đầy đủ không? Có thể thêm 'cimport numpy as np' sẽ giúp bạn? –

+0

@ S.Kozlov ofcourse nó không phải là! Đó là một đoạn mã dài và tôi đã đăng một phần mã giúp tăng thông báo lỗi. – Dalek

+0

@ S.Kozlov Thật vậy, nó nằm trên đầu mã dài. – Dalek

Trả lời

11

Ngay trước khi bạn nhận được lỗi, hãy thử in thuộc tính flags của (các) mảng bị sần mà bạn đang chuyển đến likelihood. Bạn có thể sẽ thấy một cái gì đó như:

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

Lưu ý nơi nó nói C_CONTIGUOUS : False, bởi vì đó là vấn đề. Để khắc phục, chỉ cần chuyển đổi đơn đặt hàng thành 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 
Các vấn đề liên quan