我试图以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
Run Code Online (Sandbox Code Playgroud)
在python中它只有5行,但我能想到的C++中最简单的方法是相当多的嵌套循环.请指教..
基本上我的问题是关于数组乘法,数组乘法,索引操作等数组/向量操作.在上面的例子中,res1是一个数组,包含一组从values数组中过滤掉的元素,后来应用了一些算术(减法,乘法)对于所有选定的元素).在这个python示例中,我不是复制values数组的元素,因为它在内存方面可能足够大,我只保留索引并希望能够对原始数组的一组选定元素运行算术运算.
您可以在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;
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码示例不是原始代码的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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
583 次 |
| 最近记录: |