我正在尝试编译这种代码:
def my_func(double c, int m):
cdef double f[m][m]
f = [[c for x in range(m)] for y in range(m)]
...
Run Code Online (Sandbox Code Playgroud)
提出:
Error compiling Cython file:
------------------------------------------------------------
def grow(double alpha, double beta, double gamma, int m, int s):
cdef double f[m][m]
^
------------------------------------------------------------
test.pyx:6:22: Not allowed in a constant expression
Run Code Online (Sandbox Code Playgroud)
之后我假设我不能在指向的地方使用变量,我尝试使用数值:
def my_func(double c, int m):
cdef double f[500][500]
f = [[c for x in range(500)] for y in range(500)]
...
Run Code Online (Sandbox Code Playgroud)
但后来我得到:
Error compiling Cython file:
------------------------------------------------------------
f = [[beta …Run Code Online (Sandbox Code Playgroud) 我有一些C代码具有以下声明:
int myfunc(int m, int n, const double **a, double **b, double *c);
Run Code Online (Sandbox Code Playgroud)
所以a是一个恒定的二维数组,b是一个二维数组,并且c是一维数组,都是动态分配的. b并且c在传递之前不需要任何具体的东西myfunc,应该被理解为输出信息.出于这个问题的目的,我不允许更改声明myfunc.
问题1:如何将给定的numpy数组a_np转换为a具有此C函数所需格式的数组,以便我可以在Cython中调用此C函数a?
问题2:是的声明b和c下方正确的,或者他们需要在其他格式的C函数将其理解为一个二维和一维数组(分别)?
我的尝试:
myfile.pxd
cdef extern from "myfile.h":
int myfunc(int p, int q, const double **a, double **b, double *c)
Run Code Online (Sandbox Code Playgroud)
mytest.pyx
cimport cython
cimport myfile
import numpy as np
cimport numpy as np
p = 3
q = 4 …Run Code Online (Sandbox Code Playgroud) 我对Cython比较新,遇到了一个我的研究失败的错误(我在spyder中使用Python3而我的Sython版本是0.26)
我试过这个:
import cython
@cython.boundscheck(False)
def boundtest():
cdef int r=4
cdef double l[3]
Run Code Online (Sandbox Code Playgroud)
它工作正常.但后来我尝试了这个:
import cython
@cython.boundscheck(False)
def boundtest():
cdef int r=4
cdef double l[r]
Run Code Online (Sandbox Code Playgroud)
我收到错误
[1/1] Cythonizing test.pyx
Error compiling Cython file:
------------------------------------------------------------
...
import cython
@cython.boundscheck(False)
def boundtest():
cdef int r=4
cdef double l[r]
^
------------------------------------------------------------
test.pyx:13:20: Not allowed in a constant expression
Run Code Online (Sandbox Code Playgroud)
由于找到了相关的stackexchange帖子并阅读了Kurt W. Smith的Cython书,因此添加了装饰器.据我所知,这应该告诉Cython不要担心可能因动态索引变量而导致的超出界限错误,但由于某种原因它不会.我也尝试在编译器选项中更改boundscheck并在全局范围内无效.
如果不是因为Cython文档声称是最新的,我会认为boundscheck已被折旧.
我意识到我用过import Cython而不是cimport cython.我又试过了
cimport cython
Run Code Online (Sandbox Code Playgroud)
但得到同样的错误.
在类似的说明代码
cdef int N = 3
cdef …Run Code Online (Sandbox Code Playgroud)