2017-07-17 33 views
-1

我正在尝试编写一个cython函数,该函数可以从使用c gsl库来计算spearman相关性和使用t分布的相应p值的python脚本调用。我不成功.pyx文件如下:如何在cython中使用gsl

import numpy as np 
import numpy as np 

def spearmanr(cdef double v1, cdef double v2, cdef int N): 

    cdef extern from "gsl/gsl_statistics_double.h": 
     double gsl_stats_spearman(double data1[],size_t stride1,double data2[],size_t stride2, size_t n) 

    cdef int strides = 1 
    cdef int n = N 

    cdef double r = gsl_stats_spearmanr(v1,strides,v2,strides,n) 

    cdef double tstat=r*((n-2)/(1-r**2))**0.5 

    cdef extern from "gsl/gsl_ranhist.h": 
     double gsl_cdf_tdist_Q(double x, double nu) 

    cdef double nu = N %% Do I need to Type Cast? 
    cdef double pval=gsl_cdf_tdist_Q(stat,nu) 

    return r,pal 

当我尝试编译此我得到以下错误:

running build_ext 
cythoning spear_coxen.pyx to spear_coxen.c 

Error compiling Cython file: 
------------------------------------------------------------ 
... 
import numpy as np 
cimport numpy as np 

def spermanr(cdef double v1, cdef double v2, cdef int N): 
     ^
------------------------------------------------------------ 

spear_coxen.pyx:4:13: Expected an identifier, found 'cdef' 

Error compiling Cython file: 
------------------------------------------------------------ 
... 
import numpy as np 
cimport numpy as np 

def spermanr(cdef double v1, cdef double v2, cdef int N): 
        ^
------------------------------------------------------------ 

spear_coxen.pyx:4:25: Expected ')', found 'v1' 
building 'spear_r' extension 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/Anaconda2-2.5.0/envs/python27/include/python2.7 -c spear_coxen.c -o build/temp.linux-x86_64-2.7/spear_coxen.o 
spear_coxen.c:1:2: error: #error Do not use this file, it is the result of a failed Cython compilation. 
error: command 'gcc' failed with exit status 1 

我真的不知道,如果任何的,这是正确的语法,因为我可以没有发现搜索没有产生什么,但微不足道的例子。如果有人能提供帮助,应该非常感激。谢谢

回答

0

你不需要把cdef放在你的函数参数中。即

def spearmanr(cdef double v1, cdef double v2, cdef int N): 

应该仅仅是:

cpdef spearmanr(double v1, double v2, int N): 

并移动函数声明上方的GSL的声明,而不是里面的吧。然后它可以访问你声明的函数,例如

cdef extern from "gsl/gsl_statistics_double.h": 

    double gsl_stats_spearman(double data1[],size_t stride1,double data2[],size_t stride2, size_t n) 

与其他extern一样。

而且你的声明看起来不正确的(我不是在寻找在GSL文档),但如果double data1[]你的意思是这是一个数组应该double[:,:] data1或为NumPy的memoryview矢量double[:] data1。让我知道,如果它不这样做后编译data1data2变量声明为...