gpt4 book ai didi

c++ - 将 2D numpy 数组转换为 C++ short**?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:10 25 4
gpt4 key购买 nike

所以我使用 python 调用共享 C++ 库中的方法。我在将 numpy 二维数组转换为 C++ 二维短数组作为函数输入时遇到问题。我创建了一个展示问题的玩具示例。欢迎编译并试用!

这是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++ 库 (soexample.cpp):

#include <iostream>

using namespace std;

class CPPClass
{
public:
CPPClass(){}

void func(unsigned short **array)
{
cout << array[0][0] << endl;
}
};

// For use with python:
extern "C" {
CPPClass* CPPClass_py(){ return new CPPClass(); }
void func_py(CPPClass* myClass, unsigned short **array)
{
myClass->func(array);
}
}

我用下面的命令编译:

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

最佳答案

您可以使用ctypesc_shortPOINTER 来帮助进行中间转换。以下函数将一个 numpy 数组转换为一个 C 类型的 2darray,它可以传递到一个 C 函数中,需要一个 short **

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 就可以打印出数组的所有元素:

// ...
void CPPClass::func(unsigned short **array, size_t w, size_t h)
{
for(size_t i = 0; i < w; ++i)
{
for(size_t j = 0; j < h; ++j)
cout << array[i][j] << ", ";
cout << '\n';
}
}
// ...
void func_py(CPPClass *myClass,
unsigned short **array,
size_t w, size_t h)
{
myClass->func(array, w, h);
}

定义了辅助函数后,下面的代码现在应该可以工作了:

>>> 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

关于c++ - 将 2D numpy 数组转换为 C++ short**?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com