c++ - 将 std::vector 转换为 NumPy 数组而不复制数据

标签 c++ python numpy swig

我有一个 C++ 库,它目前有一些方法,其中返回一个 std::vector 定义为

public:
  const std::vector<uint32_t>& getValues() const;

我目前正在使用 SWIG 为 Python 包装整个库,到目前为止效果很好。

SWIG 很好地包装了这个 getValues() 函数,以便它返回一个 Python 元组。问题出在我的 Python 端代码中,我想将其转换为 NumPy 数组。当然我可以这样做:

my_array = np.array(my_object.getValues(), dtype='uint32')

但这会导致原始 vector 中的所有条目首先由 SWIG 复制到 Python 元组中,然后由我再次复制到 numpy 数组中。由于这个 vector 可能非常大,我宁愿避免制作这两个拷贝,并希望有一种方法让 SWIG 在内存中的原始 vector 数据周围创建一个 numpy.array 包装器。

我已阅读 numpy.i 的文档但这明确提到不支持输出数组,因为它们似乎在 C 样式数组而不是 C++ vector 的假设下工作。

numpy.array 的底层数据结构和 C++ std::vector 一样只是一个 C 样式的数组,所以我希望在内存中访问相同的数据是可行的。

有没有办法让 SWIG 返回一个不复制原始数据的 numpy.array?

最佳答案

显然,将 C++ vector “转换”为 (C) 数组是微不足道的,请参阅此问题的答案:How to convert vector to array in C++

接下来,您可以创建一个 numpy 数组,该数组将使用该 C 数组而无需复制,请参阅 discussion here ,或谷歌搜索PyArray_SimpleNewFromData .

我不希望 SWIG 自动为您完成所有这些工作,相反,您可能应该为您的函数编写一个包装器 getValues你自己,比如 getValuesAsNumPyArray .

关于c++ - 将 std::vector 转换为 NumPy 数组而不复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16065183/

相关文章:

c++ - 是否有用于将 FLAC 转码为 MP3 的简单 C 或 C++ 库?

python - SQLAlchemy在Flask中的使用,Session管理实现

python - 以其他维度的关联值为条件对 3d numpy 数组的分配进行矢量化

Python - 获取 Pandas 的 Apply 函数上的值的索引

python-3.x - 删除最小 numpy 数组的 p%

c++ - 在这个简单的例子中,为什么 std::optional 的赋值运算符不能用于编译时上下文?

c++ - C++ 11 中 boost::scoped_ptr 的替代方案

c++ - 不终止应用程序的 glutCloseFunc

python - aiohttp.web + aiopg + sqlalchemy : random "cursor.execute() called while another coroutine is already waiting for incoming data" under load

python - 如何解析使用单引号的类似 JSON 的语法?