python - 如何使用 CFFI 将多维 Numpy 数组传递给 C 函数?

标签 python c++ numpy cffi

我正在尝试通过在 C++ 中实现一个函数并使用 CFFI 将其嵌入到我的代码中来加速我的 Python 程序。该函数采用两个 3x3 数组并计算距离。
Python代码如下:

import cffi
import numpy as np

ffi = cffi.FFI()
ffi.cdef("""
    extern double dist(const double s[3][3], const double t[3][3]);
""")
lib = ffi.dlopen("./dist.so")

S = np.array([[-1.63538,  0.379116, -1.16372],[-1.63538, 0.378137, -1.16366 ],[-1.63193, 0.379116, -1.16366]], dtype=np.float32)
T = np.array([[-1.6467834, 0.3749715, -1.1484985],[-1.6623441, 0.37410975, -1.1647063 ],[-1.6602284, 0.37400728, -1.1496595 ]], dtype=np.float32)
Sp = ffi.cast("double(*) [3]", S.ctypes.data)
Tp = ffi.cast("double(*) [3]", T.ctypes.data)

dd = lib.dist(Sp,Tp);
此解决方案无法按预期工作。实际上,C 函数打印的参数是:
 Sp=[[0.000002,  -0.270760,  -0.020458]
    [0.000002,  0.000000,  0.000000]
    [0.000000,  0.000000,  0.000000]]
 Tp=[[0.000002,  -0.324688,  -0.020588]
    [0.000002,  0.000000,  0.000000]
    [0.000000,  0.000000,  -nan]]
我还尝试了以下方法来初始化指针:
Sp = ffi.new("double *[3]")
for i in range(3):
    Sp[i] = ffi.cast("double *", S[i].ctypes.data)
Tp = ffi.new("double *[3]")
for i in range(3):
    Tp[i] = ffi.cast("double *", T[i].ctypes.data)
dd = lib.dist(Sp,Tp);
但是这个解决方案在 dist(Sp,Tp) 中出现错误。 :
TypeError: initializer for ctype 'double(*)[3]' must be a pointer to same type, not cdata 'double *[3]'
您对如何使其工作有任何想法吗?谢谢。

最佳答案

类型 double[3][3]double *[3]不等价。前者是双 3x3 的二维数组,存储为 9 个连续的 double 。后者是一个由 3 个双指针组成的数组,这不是在 C 或 C++ 中实现 2D 静态数组的方式。
numpy 数组和 C++ 静态数组都在内存中表示为连续的元素 block ,它只是 double *[3]在中间输入一个 Spanner 。你想要的是使用 double[3][3]正确或 double[3]* (指向一行三个 double 数的指针)。请注意,如果您使用后者,您可能需要将函数原型(prototype)更改为 double [][3] .

关于python - 如何使用 CFFI 将多维 Numpy 数组传递给 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64470174/

相关文章:

c++ - 如何在 C++ 中加载未引用的对象?

python - sess.run 中的 Tensorflow 不可散列类型 'list'

python - beautifulsoup上下文中lxml和html5lib的区别

python - 无法更改 _NET_WM_STRUT_PARTIAL 属性

python - 获取不同模型实例的用户输入评分的平均值 (Django)

c++ - 异构序列发生器

python - 如何使用pickle进行序列化

c++ - 编写音频源过滤器用作 Lync 麦克风

python - 与 numpy 的 np.random.RandomState 和 Python 的 random.Random 相互转换?

python - 通过获取 MySql 数组在 Python 中声明并填充数组