【发布时间】:2020-01-07 09:24:56
【问题描述】:
我正在使用作用于 Numpy 数组(非常大)的 c++ 函数来扩展 python 代码。 由于遗留问题,我目前同时拥有 PyBind 和 Python API 函数,都适用于 Python 3.6 及更高版本。 一旦我通过 ptr 访问内存,我很想确保内存布局与此 ptr 下的 c++ 数组完全对应。 我发现在这两种情况下,转置数组在 ptr 中的内容完全相同。我还发现通过 Python API 发送的子数组在 c++ 中给出的 ptr 与完整数组完全相同。在开发和测试的过程中,我还观察到了更多我认为奇怪的例子,但不能再重现它们了。 到目前为止,我在互联网上找不到任何食谱。我的解决方案是在 Python 中复制所有输入数组,例如 f(a.copy(), b.copy())
它似乎运作良好。 这是最佳/充分的解决方案吗? 我对如何生成输入数组没有任何限制。转置、子阵列、重塑,任意组合。
【问题讨论】:
-
你检查过使用 Pybind 的缓冲协议吗? pybind11.readthedocs.io/en/stable/advanced/pycpp/numpy.html
-
内存布局正好对应c++数组是什么意思?你想避免什么情况?
-
PyBind11 代码正在使用 NDArray
xja(xj); xja.ptr 据我了解,这就是 Matt 的链接模板 struct NDArray { NDArray(py::array_t &X) { auto buf=X.request(); ndim=buf.ndim;大小=缓冲区大小; for (int d=0; d -
对不起,格式很糟糕,但我所有的换行符似乎都消失了。
-
@Vladimir:回复帖子评论的正确方法通常是编辑帖子以包含新信息。