将2D numpy数组转换为c++ short**
Convert a 2D numpy array to C++ short**?
所以我使用python调用共享c++库中的方法。我有一个问题转换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++库(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
?
您可以使用ctypes
的c_short
和POINTER
来帮助进行中间转换。下面的函数将numpy数组转换为C类型的2array,该数组可以传递给期望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_py
和CPPClass::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
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 我应该删除矢量<short>吗?
- 是否有解决方法可以在 c++ 中为 short 定义用户定义的文字?
- 在<short> <double> C++ 中static_cast复杂到复杂
- 如何在 std::vector 中存储来自 std:<short>:vector <uint8_t>的数据
- 无法从'unsigned short [9]'转换为'char []'
- 有没有一种优雅的方法可以将矢量<复杂<float>>转换为矢量<short>?
- 为什么当将 short[] 转换为字符*时,数组是反转的?
- 将 typedef short 转换为矢量(字符)
- 从“ int”到'int16_t {aka short int}'内部{}的“((int)a) -1)”的缩小转换
- 'unsigned short var'与'unsigned char var [2]' C++
- 如果超过 short int(c++) 的最大值会发生什么
- C++ 中有符号 int 和无符号 short 的比较
- C++ short* to VARIANT_BOOL*
- 如何为类生成字典(向量<向量<short>>)
- Short Int基掩码在C 库子弹中的工作方式
- 将 std::vector<char> 解释为 std::vector<short>
- 什么是 ISO/IE 10646 中的"character short name"?
- 为什么C/C++会自动将char/wchar_t/short/bool/enum类型转换为int
- 为什么编译器将"char"与"int"匹配而不是"short"?