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 '<<' is ambiguous (with operand types 'ostream' (aka 'basic_ostream<char>') and 'object_item' (aka 'proxy<boost::python::api::item_policies>'))
。为什么这行不通?尝试按索引访问 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<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++)