2017-07-17 7 views
-1

私は、cgslライブラリを使ってスピアマン相関を計算し、t分布を使ってそれぞれのp値を計算するpythonスクリプトから呼び出せるcython関数を書こうとしています。次のように私の失敗.pyxファイルは次のとおりです。gslをcythonで使うには

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を関数の引数に入れる必要はありません。私。

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

そしてないそれの内側に、その関数の宣言の上ごGSLの宣言を移動:

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) 

externと同じことをします。

はまた、あなたの宣言は、あなたが、これは配列であることを意味している場合、それはdouble[:,:] data1またはnumpyののmemoryviewのためのベクトルdouble[:] data1でなければなりません間違って見て(私はGSLのドキュメントを見ていないよ)が、double data1[]data1data2のように宣言された変数のためにそれを実行した後にコンパイルされていないかどうかを教えてください...