【问题标题】:How to use gsl in cython如何在 cython 中使用 gsl
【发布时间】:2017-07-17 17:47:39
【问题描述】:

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

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

我真的不确定这是否是正确的语法,因为我找不到,因为搜索除了琐碎的例子之外没有产生任何东西。如果有人可以提供帮助,将不胜感激。谢谢你

【问题讨论】:

    标签: python c cython gsl


    【解决方案1】:

    您无需将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 或向量 double[:] data1 用于 NumPy 内存视图。让我知道在为 data1data2 声明为这样的变量之后它是否无法编译...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多