python - Cython:无法将 Python 对象转换为 'double *'

标签 python arrays list cython

我正在为 C 函数编写 Cython 包装器。我有一个具有以下签名的 pxd 文件:

double contr_hrr(int lena, double xa, double ya, double za, double *anorms)

当我尝试从 pyx 文件中调用它时

...
return contr_hrr(len(acoefs),a.origin[0],a.origin[1],a.origin[2],anorms2)

其中 anorms2 是一个 python 列表,我收到错误消息:

cython/ctwo.pyx:35:80: Cannot convert Python object to 'double *'

如何将 python 列表作为 double 组传递给 C 函数?

最佳答案

  1. cimport array:

    from cpython cimport array
    
  2. 从您的列表中创建一个数组对象。数组类构造函数将完成分配内存和迭代列表的所有繁重工作(实际上可以是任何可迭代的)。

    cdef array.array anorms2_arr = array.array('d', anorms2)
    
  3. 将其数据传递给您的函数:

    return contr_hrr(.., anorms2_arr.data.as_doubles)
    

array 是一个 standard Python module . Cython 在上面添加了一些特殊的支持,比如缓冲区接口(interface)和通过 arr.data.as_xxx 直接访问底层内存块。不幸的是,此支持仅记录在案 here . 您还可以在 this recent thread 中找到有关数组使用的一些详细信息。 .

关于python - Cython:无法将 Python 对象转换为 'double *',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17014379/

相关文章:

C unsigned char 字符串数组

linux - 在 linux 中,如何仅按文件名比较两个目录并获取不匹配的结果列表

python - 网页抓取 : Xpath list index out range

python - 如何访问conda环境?

python - 在 Python 中通过重定向获取 session ID

python - 如果Python中满足条件,如何从列表中提取值?

python - 将列表与不同大小的子列表组合

php - 如何使用shell命令在php中执行python脚本?

C++ 对象数组 - 类型不完整

c++ - 二进制数据的 char * 的 fwrite 等价物