亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

慕桂英546537 2023-12-20 19:59:22
我試圖通過在 C++ 中實現一個函數并使用 CFFI 將其嵌入到我的代碼中來加速我的 Python 程序。該函數采用兩個 3x3 數組并計算距離。Python代碼如下:import cffiimport numpy as npffi = 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]'您知道如何使其發揮作用嗎?謝謝。
查看完整描述

1 回答

?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

類型double[3][3]double *[3]不等效。前者是一個 double 3x3 的 2D 數組,存儲為 9 個連續的 double。后者是一個由 3 個雙指針組成的數組,這不是 C 或 C++ 中 2D 靜態數組的實現方式。

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


查看完整回答
反對 回復 2023-12-20
  • 1 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號