C++ Boost Python numpy 数组初始化

Posted

技术标签:

【中文标题】C++ Boost Python numpy 数组初始化【英文标题】:C++ Boost Python numpy array initialization 【发布时间】:2017-03-06 01:05:27 【问题描述】:

在 Python 中,我可以使用负 inf 初始化一个 x 长度的 numpy 数组

import numpy as np
...
foo = np.array([np.NINF] * x)

其中x 是一个整数,例如42. 我想在 C++ 中用 Boost.Python 做同样的事情。以下显然行不通:

namespace bnp = boost::python::numpy;
...
bnp::ndarray foo = bnp::array(-INFINITY * x);

有什么好的方法可以做到这一点?

是的,我知道Boost.Numpy docs and tutorial——它们不是很好。

更一般地说,如何使用值 -INFINITY 初始化长度为 x 的标准向量或数组?

更新:

我正在尝试通过打印到控制台来验证方法(使用 cmets 中建议的初始循环)

for (auto i=0; i<x; ++i) 
    std::cout << foo[i] << '\n';

但得到以下错误:error: use of overloaded operator '&lt;&lt;' is ambiguous (with operand types 'ostream' (aka 'basic_ostream&lt;char&gt;') and 'object_item' (aka 'proxy&lt;boost::python::api::item_policies&gt;'))。为什么这行不通?尝试按索引访问 boost numpy 数组是否有问题?

【问题讨论】:

根据文档,您可以从 python 列表构造一个数组。您是否尝试过类似bp::list l; l.append(-INFINITY); l *= x; bnp::ndarray foo = bnp::array(l) 的方法?不幸的是,我手头没有带有 numpy 支持的 boost python 版本来测试它。 您可以使用算法头中的 std::fill 来初始化向量或数组 @Kochoba 你能否详细说明这如何适用于这个问题?根据我的发现,从std::vector 中获取boost::python::list 的最直接方法是在循环中追加。使用boost::python::numpy::from_data 似乎并不比上面的 4 个语句更简洁。无论如何,我们将创建一个新向量,因此我们可以直接在构造函数中填充它。还是你有别的想法?具体是什么? @DanMašek 更一般地说,如何使用值 -INFINITY 初始化长度为 x 的标准向量或数组 @DanMašek 感谢您的建议。我正在尝试bpy::list temp_list;for (auto i=0; i&lt;x; ++i) temp_list.append(-INFINITY);bnp::ndarray foo = bnp::array(temp_list);。我不确定这是否按预期工作,并相应地更新了问题。 【参考方案1】:

这是一个解决方案(感谢@DanMašek 的最初想法)以及如何通过打印到控制台来验证:

bpy::list temp_list;
temp_list.append(-INFINITY);
temp_list *= x;
bnp::ndarray foo = bnp::array(temp_list);

我有 x=9。验证 w/

std::cout << std::endl << "Python ndarray : " << bpy::extract<char const *>(bpy::str(foo)) << std::endl;

您也可以使用相同的temp_list 来初始化另一个 Python ndarray:

// after initializing bar the same as foo w/ temp_list
bar[0] = 0;
std::cout << std::endl << "Python ndarray : " << bpy::extract<char const *>(bpy::str(bar)) << std::endl;

然后打印出来:

Python ndarray : [-inf -inf -inf -inf -inf -inf -inf -inf -inf]

Python ndarray : [  0. -inf -inf -inf -inf -inf -inf -inf -inf]

【讨论】:

不错。一条评论——由于您将列表的所有元素设置为相同的值,您可以像在 Python 中一样使用 * 运算符。

以上是关于C++ Boost Python numpy 数组初始化的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 boost/python numpy 库进行编译? make 找不到库文件

Python 的 C++ 扩展模块返回一个 Numpy 数组

Boost.Python:匹配 C++ 模板类型的嵌套命名空间

将 C++ 数组发送到 Python 并返回(使用 Numpy 扩展 C++)

如何在 C++ 中创建类似于 Python 的 numpy 数组的数组?

C++ vs python numpy 复杂数组的性能