Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python/Numpy代码转换为Cython-数组问题-缓冲区类型仅允许作为函数局部变量?_Python_Arrays_Numpy_Cython - Fatal编程技术网

将Python/Numpy代码转换为Cython-数组问题-缓冲区类型仅允许作为函数局部变量?

将Python/Numpy代码转换为Cython-数组问题-缓冲区类型仅允许作为函数局部变量?,python,arrays,numpy,cython,Python,Arrays,Numpy,Cython,我正在尝试将一些Python/Numpy代码转换为Cython以提高速度。这是我的密码: cimport numpy as np import numpy as np from numpy import * import pylab as pl from pylab import * from scipy import integrate def myc_rb_e2f(np.ndarray[double,ndim=1] y = np.zeros(7),double t, double k,d

我正在尝试将一些Python/Numpy代码转换为Cython以提高速度。这是我的密码:

cimport numpy as np
import numpy as np
from numpy import *
import pylab as pl
from pylab import * 
from scipy import integrate

def myc_rb_e2f(np.ndarray[double,ndim=1] y = np.zeros(7),double t, double k,double d):

    M = y[0]
    E = y[1]
    CD = y[2]
    CE = y[3]
    R = y[4]
    RP = y[5] 
    RE = y[6]

    cdef double S = 0.01
    if t > 300.0:
        S = 5.0
    #if t > 400
        #S = 0.01

    cdef double t1 = k[0]*S/(k[7]+S)
    cdef double t2 = k[1]*(M/(k[14]+M))*(E/(k[15]+E))
    cdef double t3 = k[5]*M/(k[14]+M)
    cdef double t4 = k[11]*CD*RE/(k[16]+RE)
    cdef double t5 = k[12]*CE*RE/(k[17]+RE)
    cdef double t6 = k[2]*M/(k[14]+M)
    cdef double t7 = k[3]*S/(k[7]+S)
    cdef double t8 = k[6]*E/(k[15]+E)
    cdef double t9 = k[13]*RP/(k[18]+RP)
    cdef double t10 = k[9]*CD*R/(k[16]+R)
    cdef double t11 = k[10]*CE*R/(k[17]+R)

    dM = t1-d[0]*M
    dE = t2+t3+t4+t5-k[8]*R*E-d[1]*E
    dCD = t6+t7-d[2]*CD
    dCE = t8-d[3]*CE
    dR = k[4]+t9-k[8]*R*E-t10-t11-d[4]*R
    dRP = t10+t11+t4+t5-t9-d[5]*RP
    dRE = k[8]*R*E-t4-t5-d[6]*RE

    dy = [dM,dE,dCD,dCE,dR,dRP,dRE]

    return dy

cdef np.ndarray[double,ndim=1] t = np.zeros(10000)
t = np.linspace(0.,3000.,10000.)

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=1] E_avg = np.zeros([10000])
cdef np.ndarray[double,ndim=1] k = np.zeros([19])
cdef np.ndarray[double,ndim=1] d = np.zeros([7])
cdef int i

for i in range (0,5000):
    k[0] = 1.+0.1*randn(1)
    k[1] = 0.15+0.05*randn(1)
    k[2] = 0.2+0.05*randn(1)
    k[3] = 0.2+0.05*randn(1)
    k[4] = 0.35+0.05*randn(1)
    k[5] = 0.001+0.0001*randn(1)
    k[6] = 0.5+0.05*randn(1)
    k[7] = 0.3+0.05*randn(1)
    k[8] = 30.+5.*randn(1)
    k[9] = 18.+3.*randn(1)
    k[10] = 18.+3.*randn(1)
    k[11] = 18.+3.*randn(1)
    k[12] = 18.+3.*randn(1)
    k[13] = 3.6+0.5*randn(1)
    k[14] = 0.15+0.05*randn(1)
    k[15] = 0.15+0.05*randn(1)
    k[16] = 0.92+0.1*randn(1)
    k[17] = 0.92+0.1*randn(1)
    k[18] = 0.01+0.001*randn(1)
    d[0] = 0.7+0.05*randn(1)
    d[1] = 0.25+0.025*randn(1)
    d[2] = 1.5+0.05*randn(1)
    d[3] = 1.5+0.05*randn(1)
    d[4] = 0.06+0.01*randn(1)
    d[5] = 0.06+0.01*randn(1)
    d[6] = 0.03+0.005*randn(1)
    r = integrate.odeint(myc_rb_e2f,y0,t,args=(k,d))
    E_simulated[:,i] = r[:,1]

for i in range(0,10000):
    E_avg[i] = sum(E_simulated[i,:])/5000.

pl.plot(t,E_avg,'-ro')
pl.show()
我在尝试编译时遇到了一系列错误:

Error compiling Cython file:
------------------------------------------------------------
...

        dy = [dM,dE,dCD,dCE,dR,dRP,dRE]

        return dy

cdef np.ndarray[double,ndim=1] t = np.zeros(10000)
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:48:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...

cdef np.ndarray[double,ndim=1] t = np.zeros(10000)
t = np.linspace(0.,3000.,10000.)

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:52:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...
cdef np.ndarray[double,ndim=1] t = np.zeros(10000)
t = np.linspace(0.,3000.,10000.)

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:53:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...
t = np.linspace(0.,3000.,10000.)

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:54:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=1] E_avg = np.zeros([10000])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:55:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...
# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=1] E_avg = np.zeros([10000])
cdef np.ndarray[double,ndim=1] k = np.zeros([19])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:56:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=1] E_avg = np.zeros([10000])
cdef np.ndarray[double,ndim=1] k = np.zeros([19])
cdef np.ndarray[double,ndim=1] d = np.zeros([7])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:57:31: Buffer types only allowed as function local variables

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

myc_rb_e2f_pyx.pyx:1:0: Buffer vars not allowed in module scope
An exception has occurred, use %tb to see the full traceback.

SystemExit: error: command 'gcc' failed with exit status 1


%run setup.py build_ext --inplace
running build_ext
cythoning myc_rb_e2f_pyx.pyx to myc_rb_e2f_pyx.c
building 'myc_rb_e2f_pyx' extension
C:\Python27\Scripts\gcc.exe -mno-cygwin -mdll -O -Wall -DMS_WIN64 -IC:\Python27\lib\site-packages\numpy\core\include -IC:\Python27\include -IC:\Python27\PC -c myc_rb_e2f_pyx.c -o build\temp.win-amd64-2.7\Release\myc_rb_e2f_pyx.o

Error compiling Cython file:
------------------------------------------------------------
...

        dy = [dM,dE,dCD,dCE,dR,dRP,dRE]

        return dy

cdef np.ndarray[double,ndim=1] t = np.zeros(10000)
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:48:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...

cdef np.ndarray[double,ndim=1] t = np.zeros(10000)
t = np.linspace(0.,3000.,10000.)

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:52:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...
cdef np.ndarray[double,ndim=1] t = np.zeros(10000)
t = np.linspace(0.,3000.,10000.)

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:53:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...
t = np.linspace(0.,3000.,10000.)

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:54:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...

# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=1] E_avg = np.zeros([10000])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:55:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...
# Initial concentrations of [M,E,CD,CE,R,RP,RE]
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=1] E_avg = np.zeros([10000])
cdef np.ndarray[double,ndim=1] k = np.zeros([19])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:56:31: Buffer types only allowed as function local variables

Error compiling Cython file:
------------------------------------------------------------
...
cdef np.ndarray[double,ndim=1] y0 = np.array([0.,0.,0.,0.,0.4,0.,0.25])
cdef np.ndarray[double,ndim=2] E_simulated = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=2] r = np.zeros([10000,5000])
cdef np.ndarray[double,ndim=1] E_avg = np.zeros([10000])
cdef np.ndarray[double,ndim=1] k = np.zeros([19])
cdef np.ndarray[double,ndim=1] d = np.zeros([7])
                              ^
------------------------------------------------------------

myc_rb_e2f_pyx.pyx:57:31: Buffer types only allowed as function local variables

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

myc_rb_e2f_pyx.pyx:1:0: Buffer vars not allowed in module scope
An exception has occurred, use %tb to see the full traceback.

SystemExit: error: command 'gcc' failed with exit status 1

有人能帮我指出我在声明数组方面的错误吗

错误消息非常清楚:顶级不允许使用缓冲区类型的变量。将从声明
t
开始的所有代码放在一个函数中,比如说
main
,然后调用该函数。

错误消息非常清楚:顶层不允许使用缓冲区类型的变量。将从
t
声明开始的所有代码放在一个函数中,比如说
main
,然后调用该函数。

你能链接到任何与此限制相关的文档吗?@pelson:不幸的是,Cython文档从来都不是最新的。不过,您可以自己轻松地尝试,这将给出OP遇到的错误消息,即使在最新版本的Cython中也是如此。好的,干杯。我得到了同样的错误,只针对类中的方法(没有主级别的东西)。我想我很快会在这里发布一个问题。@pelson:你的意思是作为
cdef类的成员?我昨天才试过,但不支持:(你能链接到任何与此限制相关的文档吗?@pelson:不幸的是,Cython文档从来都不是最新的。不过,你可以自己很容易地尝试一下,这将给出OP遇到的错误消息,即使是在Cython的最新版本中。好的,干杯。我得到了相同的错误,只针对类中的方法(没有主要级别的内容)。我想我很快会在这里发布一个问题。@pelson:你的意思是作为
cdef类
成员?我昨天才试过,但不支持:(