我正试图以python的方式找出用于数组操作的最佳C ++库/包。基本上我需要这样简单:
values = numpy.array(inp.data)
idx1 = numpy.where(values > -2.14)
idx2 = numpy.where(values < 2.0)
res1 = (values[idx1] - diff1)/1000
res2 = (values[idx2] - diff2)*1000
在python中它只有5行,但我能想到的C ++中最简单的方法是很多嵌套循环。请指教..
基本上我的问题是数组/向量操作,如数组乘法,索引操作等。在上面的例子中,res1是一个数组,包含一组从values数组中过滤掉的元素,后来应用了一些算术(减法,所有选定元素的乘法)。在这个python示例中,我不是复制values数组的元素,因为它在内存方面可能足够大,我只保留索引并希望能够对原始数组的一组选定元素运行算术运算
答案 0 :(得分:5)
你根本不应该使用数组。请坐下来了解std :: vector类以及迭代器和标准库算法。我强烈建议您阅读这本书The C++ Standard Library。
答案 1 :(得分:5)
您可以在C ++中实现类似的功能,但不应该使用普通的C数组。
我能看到这项工作的最简单方法是使用std::set
浮点数(您的代码看起来假设数据按升序排序)。你也可以使用std::vector
浮点数,但你必须自己排序,可能是使用std::sort
。
在这种情况下,您的示例代码可能如下所示 - 该集合假设值是唯一的,如果不是,则可以使用std::multiset
代替;
std::set<float> values(inp.data.begin(), inp.data.end());
std::set<float>::iterator idx1 = values.lower_bound(-2.14);
std::set<float>::iterator idx2 = values.upper_bound(2.0);
float res1 = (*idx1 - diff1) / 1000.0;
float res2 = (*idx2 - diff2) / 1000.0;
请注意,上述代码示例不是原始代码的100%转换 - lower_bound
为您提供等于或大于-2.14的第一个元素。我也没有为失败添加任何检查代码 - 如果lower_bound
或upper_bound
找不到匹配的元素,他们会返回values.end()
,例如。
使用vector,示例看起来非常相似,只需要一行来预先对矢量进行排序:
std::vector<float> values(inp.data.begin(), inp.data.end());
std::sort(values.begin(), values.end();
std::vector<float>::iterator idx1 = std::lower_bound(values.begin(), values.end(), -2.14);
std::vector<float>::iterator idx2 = std::upper_bound(values.begin(), values.end(), 2.0);
float res1 = (*idx1 - diff1) / 1000.0;
float res2 = (*idx2 - diff2) / 1000.0;
答案 2 :(得分:4)
我建议您检查算法标题。 也不使用数组,你有std :: vector或boost(很快就是std):: array。
答案 3 :(得分:1)
如果我没弄错的话,numpy主要是用C语言编写的(带有Python包装器),所以你可以直接从C ++中使用它而不费力。
答案 4 :(得分:1)
如果你合并std::vector
和boost::lambda
,你可以非常接近你的榜样:
#include <algorithm>
#include <iostream>
#include <vector>
#include <boost/lambda/lambda.hpp>
using boost::lambda::_1;
int main() {
float ary[10] = { -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 };
std::vector<float> v(&ary[0], &ary[10]);
std::vector<float>::iterator iter1, iter2;
iter1 = std::find_if(v.begin(), v.end(), (_1 > -2.14));
iter2 = std::find_if(v.begin(), v.end(), (_1 < 2.0));
// output:
// iter1 = -2.000
// iter2 = 1.000
std::cout
<< "iter1 = " << *iter1 << "\n"
<< "iter2 = " << *iter2 << "\n"
<< std::endl;
return 0;
}