【问题标题】:Convert a 2D numpy array to C++ short**?将 2D numpy 数组转换为 C++ 短**?
【发布时间】:2013-06-10 14:15:09
【问题描述】:

所以我使用 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

【问题讨论】:

  • 我相信 C 的短整数是 16 位的。另一方面,默认的 numpy int 通常是 32 位。您可以尝试将您的数组创建为array = np.array([[1,2,3],[1,2,3]], dtype=np.uint16),看看会发生什么。

标签: c++ python numpy shared-libraries short


【解决方案1】:

您可以使用ctypesc_shortPOINTER 来帮助进行中间转换。以下函数将一个 numpy 数组转换为一个 C 类型的 2darray,可以将其传递给一个需要 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 以采用两个额外的参数,即给定数组的宽度和长度。有了这个,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

【讨论】:

猜你喜欢
  • 2013-06-30
  • 2021-12-29
  • 2012-06-08
  • 2022-01-17
  • 1970-01-01
  • 2019-10-31
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多