簡體   English   中英

如何使用 CFFI 將多維 Numpy 數組傳遞給 C 函數?

[英]How to pass multidimensional Numpy arrays to C function using 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]不等價。 前者是一個double 3x3的二維數組,存儲為9個連續的double。 后者是一個包含 3 個雙指針的數組,這不是在 C 或 C++ 中實現 2D 靜態數組的方式。

numpy 數組和 C++ 靜態數組在內存中都表示為一個連續的元素塊,只是中間的double *[3]類型在工作中引發了問題。 您想要的是正確使用double[3][3]double[3]* (指向一行三個雙打的指針)。 請注意,如果您使用后者,您可能需要將函數原型更改為采用double [][3]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM