【发布时间】:2017-03-07 00:04:55
【问题描述】:
我有一个长度为 x 的 Boost.Numpy 数组 foo,例如foo = [-0.7, -0.9, -0.6]。我想从每个元素中减去最大值,得到foo = [-0.1, -0.3, 0.0]。尝试boost::range::max_element(foo) 我得到error: no matching function for call to 'max_element'。所以我做了以下黑客以获得最大值,
// a bunch of hacky stuff b/c std algorithms don't work well w/ boost arrays
Py_intptr_t const *foo_stride = foo.get_strides();
char const *begin_foo = foo.get_data();
char const *end_foo = foo + foo_stride[0]*x;
double foo_max = *std::max_element(begin_foo, end_foo);
然后我尝试使用 lambda 减去最大值:
std::for_each(begin_foo, end_foo, [](double& d) {d-=foo_max;});
但无济于事:error: no matching function for call to object of type 指向捕获[];尝试[&] 和[=] 也不起作用。所以我现在有一个 for 循环:
for (auto i=0; i<x; ++i) {foo[ii] -= foo_max;}
但这并没有按预期工作。 foo_max 实际上是一个在前面的赋值中被转换为 double 的字符。因此,较早找到最大值的技巧被破坏了。请帮忙。我知道 Boost.Numpy docs、tutorials 和 examples,它们相当差。
【问题讨论】:
-
今天不是你的日子。:)
-
char const *begin_foo-- 如果你想读取双精度而不是有符号字节,应该将它们转换为double const*.... -
一些进一步的想法 - 有
numpy.amax。 Boost python 让我们import modules,表示为object。我们可以获取属性(函数是模块的属性)并将它们存储在object实例中,我们可以在这些对象上使用operator()来调用它们所代表的函数。所以你可以得到一个对象来代表numpy.amax并用它来获得最大值。 (续...) -
感谢@DanMašek 的提示!我尝试了
boost::python::object numpy = bpy::import("numpy");然后double Y_left_max = numpy.amax(foo);,但这不会构建 b/cerror: no member named 'amax' in 'boost::python::api::object'。 -
@DanMašek 啊,当然,现在可以了,谢谢。