相关疑难解决方法(0)

如何在Cython中声明2D列表

我正在尝试编译这种代码:

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)

python cython

8
推荐指数
2
解决办法
6990
查看次数

将Cython中的numpy数组传递给需要动态分配数组的C函数

我有一些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:是的声明bc下方正确的,或者他们需要在其他格式的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)

c python arrays numpy cython

7
推荐指数
2
解决办法
2938
查看次数

Cython"不允许在常量表达式中",boundscheck False不起作用

我对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已被折旧.

UPDATE

我意识到我用过import Cython而不是cimport cython.我又试过了

cimport cython
Run Code Online (Sandbox Code Playgroud)

但得到同样的错误.

更新2

在类似的说明代码

cdef int N = 3
cdef …
Run Code Online (Sandbox Code Playgroud)

python cython python-3.x cythonize

4
推荐指数
1
解决办法
1332
查看次数

标签 统计

cython ×3

python ×3

arrays ×1

c ×1

cythonize ×1

numpy ×1

python-3.x ×1