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

Posted

技术标签:

【中文标题】如何使用 ctypes 将 numpy ndarrays 传递给 c++ 函数?【英文标题】:How to pass numpy ndarrays to a c++ function using ctypes? 【发布时间】:2019-09-15 20:26:08 【问题描述】:

我花了两天时间弄清楚如何将 ndarrays 传递给 c/c++,但仍然没有找到任何可以正常工作的东西。 每件事都被记录得很糟糕而且令人困惑。 我发现的唯一教程在https://scipy.github.io/old-wiki/pages/C%2B%2B_Extensions_that_use_NumPy_arrays.html。 但是当我尝试运行 python 代码“myextension.py”时,它会引发 ImportError:没有名为 numpyndarrays 的模块。

我不想使用 cython、boost 或 python C-API。

这是我编译到共享库的 c++ 代码“n.cpp”:

#include <iostream>
#include "ndarray.h"

extern "C" 

Ndarray<double, 3> myfunc(numpyArray<double> array1)

    Ndarray<double,3> a(array1);
    std::cout<<a.getShape(0); //this prints 0 and it means somthing is wrong

    for (int i = 0; i < a.getShape(0); i++)
    
        for (int j = 0; j < a.getShape(1); j++)
        
            for (int k = 0; k < a.getShape(2); k++)
            
                a[i][j][k] = 2.0 * a[i][j][k];
                std::cout<<a[i][j][k]<<' '<<i<<' '<<j<<' '<<k<<'\n';// prints nothing because a.getShape(0) is 0.
            
        
    
    return a;


起初,当我尝试编译这段代码时,编译器引发了致命错误,因为它找不到 ndarray.h。 我从https://scipy.github.io/old-wiki/pages/ndarray2e5c.h?action=AttachFile&do=get&target=ndarray.h手动下载了ndarray.h文件

这是我的python代码:

import numpy as np
import numpy.ctypeslib as ct

mylib = ct.load_library('n', '.')       

def myfunc(array1):
    return mylib.myfunc(array1.ctypes) # I also tried ct.as_ctypes(array1) instead of array1.ctypes with no success

a = np.ones((2,2,2)).astype(np.double)

myfunc(a)

此代码正确加载共享库,主要问题是如何将 numpy ndarray 转换为作为共享库输入的结构。 我还需要知道,如何将共享库的输出转换为 numpy ndarray。

【问题讨论】:

你正在看的教程真的已经过时了,ndarray.h 甚至都不存在了。在此处尝试 numpy 文档中的最新教程:numpy.org/doc/1.16/user/c-info.python-as-glue.html#index-3 【参考方案1】:

我发现使用 numpy C-API 是将 numpy 数组传递给 c++ 的最简单方法。 可以在https://docs.scipy.org/doc/numpy/reference/c-api.html 上找到该文档。

【讨论】:

以上是关于如何使用 ctypes 将 numpy ndarrays 传递给 c++ 函数?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

如何使用 ctypes 将数组从 C++ 函数返回到 Python

ndarray对象的使用方法

无法将 NumPy 数组转换为张量(不支持的对象类型 numpy.ndarray)错误

NumPy简介