使用 ctypes 将 (uint8) NumPy 数组从 python 传递到 c++

Posted

技术标签:

【中文标题】使用 ctypes 将 (uint8) NumPy 数组从 python 传递到 c++【英文标题】:Passing a (uint8) NumPy array from python to c++ using ctypes 【发布时间】:2018-03-11 03:40:45 【问题描述】:

我已经设法使它适用于双 NumPy 值,但对于 uint8 我没有打印输出。

C++ 文件 foo.cpp(简单地遍历数组):

#include <iostream>
using namespace std;

extern "C" void cfoo(const uint8_t *indatav, int rows, int cols)

    for (int i = 0; i < rows; ++i)
      for (int j = 0; j < cols; ++j)
        cout << "c++ vals --> " << indatav[i + cols * j] << '\n';
      
    

使其成为共享库:

gcc -lstdc++ -shared -o foo.so foo.cpp

(绑定)Python 脚本(将 NumPy 数组传递给 C++):

import ctypes
import numpy.ctypeslib as ctl
from numpy.ctypeslib import ndpointer
import numpy as np

lib = ctypes.cdll.LoadLibrary("./foo.so")
cfoo = lib.cfoo
cfoo.restype = None
cfoo.argtypes = [ctl.ndpointer(np.uint8, flags='aligned, c_contiguous'), ctypes.c_int, ctypes.c_int]

# Initialize np.array    
pyvals = np.array([[1,2],[3,4]], dtype=np.uint8)
print "pyvals type : ",pyvals.dtype

for i in range (0,pyvals.shape[0]):
    for j in range (0, pyvals.shape[1]):
        print "python vals", pyvals[i,j]

# Call c++ function 
cfoo(pyvals , pyvals.shape[0], pyvals.shape[1]) 

输出(我在 cout ... 中看不到打印):

pyvals type :  uint8
python vals 1
python vals 2
python vals 3
python vals 4
c++ vals -->
c++ vals -->
c++ vals -->
c++ vals -->

但是,当我将 dtype=np.uint8 更改为 dtype=np.double 并将 const uint8_t *indatav 更改为 const double *indatav 时,我得到了正确的结果:

indata type :  float64
python vals 1.0
python vals 2.0
python vals 3.0
python vals 4.0
c++ vals --> 1
c++ vals --> 3
c++ vals --> 2
c++ vals --> 4

我应该对 uint8 numpy.ndarray 进行哪些更改才能正常工作??

【问题讨论】:

【参考方案1】:

找到了!

我不得不将数组转换为 unsigned int,因为 ostream&operator

indatav[i + cols * j] 更改为static_cast&lt;unsigned int&gt;(indatav[i + cols * j]) 解决了问题!

谢谢!

【讨论】:

以上是关于使用 ctypes 将 (uint8) NumPy 数组从 python 传递到 c++的主要内容,如果未能解决你的问题,请参考以下文章

将 ctypes int** 转换为 numpy 二维数组

如何使用 ctypes 将 numpy ndarrays 传递给 c++ 函数?

使用 ctypes 从 C 结构数组到 NumPy 数组的高效转换

为啥移动 numpy uint8 会产生负值?

如何管理 ctypes 中的嵌套结构?

使用 numpy/ctypes 公开 C 分配的内存缓冲区的更安全方法?