将2D数字数组转换为C++短**?

2024-10-02 20:30:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在共享C++库中使用Python调用方法。我有一个问题转换为一个函数输入的一个NUMPY 2D阵列到一个C++的2D数组。我有一个创造了一个玩具的例子,展示了这个问题。请随意编译并试用它!在

这是python代码(soexample.py)公司名称:

# Python imports
from ctypes import CDLL
import numpy as np

# Open shared CPP library:
cpplib=CDLL('./libsoexample.so')
cppobj = cpplib.CPPClass_py()

# Stuck on converting to short**?
array = np.array([[1,2,3],[1,2,3]])
cpplib.func_py(cppobj,array)

这里是C++库示例.cpp)公司名称:

^{pr2}$

我用以下命令编译它:

g++ -fPIC -Wall -Wextra -shared -o libsoexample.so soexample.cpp

运行python文件时,会出现以下错误:

>> python soexample.py
Traceback (most recent call last):
  File "soexample.py", line 13, in <module>
    cpplib.func_py(cppobj,array)
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to     convert parameter 2

如何正确地纠正这个不幸的TypeError?在


Tags: topyimport名称sonp公司ctypes
1条回答
网友
1楼 · 发布于 2024-10-02 20:30:41

您可以使用ctypesc_short和{}来帮助进行中间转换。下面的函数将一个numpy数组转换成一个C-type2darray,它可以被传递到一个需要short **的C函数中。在

def c_short_2darr(numpy_arr):
  c_short_p = POINTER(c_short)
  arr = (c_short_p * len(numpy_arr) ) ()
  for i in range(len(numpy_arr)):
    arr[i] = (c_short * len(numpy_arr[i]))()
    for j in range(len(numpy_arr[i])):
      arr[i][j] = numpy_arr[i][j]
  return arr

注意,我修改了func_pyCPPClass::func以获得2个额外的参数,即给定数组的宽度和长度。这样,CPPClass::func可以打印出数组的所有元素:

^{pr2}$

定义了该助手函数后,现在应该可以执行以下操作:

>>> arr = numpy.array([ [1,2,3], [4,5,6] ])
>>> arr
array([[1, 2, 3],
       [4, 5, 6]])
>>> cpplib.func_py(cppobj, c_short_2darr(arr), 2, 3)
1, 2, 3,
4, 5, 6,
0

相关问题 更多 >