Pybind11 默认参数 numpy 数组或 None
Pybind11 default argument numpy array or None
我正在包装一些C++代码以从Python使用它。我想调用一个带有参数的 C++ 函数,该参数可以采用另一个输入变量相同大小的None
值或numpy.array
。这是一个例子:
import example
# Let I a numpy array containing a 2D or 3D image
M = I > 0
# Calling the C++ function with no mask
example.fit(I, k, mask=None)
# Calling the C++ function with mask as a Numpy array of the same size of I
example.fit(I, k, mask=M)
如何使用 pybind11 在C++中对其进行编码?我有以下函数签名和代码:
void fit(const py::array_t<float, py::array::c_style | py::array::forcecast> &input,
int k,
const py::array_t<bool, py::array::c_style | py::array::forcecast> &mask)
{
...
}
PYBIND11_MODULE(example, m)
{
m.def("fit", &fit,
py::arg("input"),
py::arg("k"),
py::arg("mask") = nullptr // Don't know what to put here?
);
谢谢!
使用 C++17 的std::optional
,这里有一个应该可以工作的示例。对于早期版本的C++,您可能需要向后移植optional.h
并实现自己的optional_caster
,类似于pybind11/stl.h
中的。
假设你想要这个函数:
def add(a, b=None):
# Assuming a, b are int.
if b is None:
return a
else:
return a + b
下面是等效C++ pybind 实现:
m.def("add",
[](int a, std::optional<int> b) {
if (!b.has_value()) {
return a;
} else {
return a + b.value();
}
},
py::arg("a"), py::arg("b") = py::none()
);
在python中,这个函数可以用:
add(1)
add(1, 2)
add(1, b=2)
add(1, b=None)
对于 numpy 数组,只需在示例中使用std::optional<py:array>
或std::optional<py:array_t<your_custom_type>>
修改std::optional<int>
即可。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '