pybind11::array_t 是不是有(深)复制构造函数?

Posted

技术标签:

【中文标题】pybind11::array_t 是不是有(深)复制构造函数?【英文标题】:Is there a (deep) copy constructor for pybind11::array_t?pybind11::array_t 是否有(深)复制构造函数? 【发布时间】:2019-06-13 07:22:32 【问题描述】:

我有一个现有的pybind11::array_t,需要进行复制构建。 pybind11 中是否有允许我对 array_t 进行深层复制的函数?

我知道我可以创建一个新的array_t,调整它的大小,然后将原始数据复制到其中,但我想知道是否已经存在隐藏这些段落的方法。

【问题讨论】:

你确定auto copy = original; 没有做你想做的事吗? 是的,因为这涉及到浅拷贝。这个 sn-p 打印相同的地址:using py_arr = pybind11::array_t<double>; py_arr a; auto b = a; std::cout << b.data() << " " << a.data() << std::endl; 【参考方案1】:

默认的复制构造函数执行深拷贝,people are actually trying to avoid this :)

要使用复制构造函数,可以通过buffer

using py_arr = pybind11::array_t<double>;
py_arr a;

// do stuff with a, fill it and everything...

auto buffer = a.request(); 
py_arr b = py_arr(buffer);

std::cout << b.data() << " " << a.data() << std::endl; // this won't return the same address twice

【讨论】:

感谢您的评论。 (a) 我同意缓冲选项。但是,request 是一个 const 方法,因此如果您在某处有一个接受const pybind11::array_t &amp; a 的函数,并且想要创建它的深层副本,则需要const_cast。这就是我要求深拷贝构造函数或类似方法的原因。 (2) py::array_t 的默认复制构造函数执行 shallow 复制。 using py_arr = pybind11::array_t&lt;double&gt;; py_arr a; py_arr b(a); std::cout &lt;&lt; b.data() &lt;&lt; " " &lt;&lt; a.data() &lt;&lt; std::endl; 打印相同的地址。 如果没有其他选择,我可以使用缓冲区,但我希望有一种替代的、更紧凑的方式也适用于 const 情况。 哦,我明白了,您可以使用我刚刚给出的实现重载 = 运算符(请参阅 this answer),这应该可以解决您的问题吧? 嗨,很抱歉回复晚了 :) 是的,我可以重载它,但它会破坏语义。有些地方我需要浅拷贝,有些地方我需要深拷贝。我想我将只使用缓冲区,即使我必须const_cast。感谢您的帮助!

以上是关于pybind11::array_t 是不是有(深)复制构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

尝试导入 pybind opencv 模块时出现 libgtk 错误

使用 pybind11 构建 cpp

嵌套 dict 和 pybind11

返回多个 py::array 而不在 pybind11 中复制

Pybind - 使用指向派生类的共享指针调用函数

PyBind - 重载函数