C++ Arrays操作(类似python的操作)

Lin*_*nai 2 c++ python arrays

我试图以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数组的元素,因为它在内存方面可能足够大,我只保留索引并希望能够对原始数组的一组选定元素运行算术运算.

小智 5

你根本不应该使用数组.请坐下来了解std :: vector类以及迭代器和标准库算法.我强烈建议您阅读"C++标准库 "一书.

  • 海报所谓的"数组"不一定是C数组,它是一般概念. (2认同)

Tim*_*sch 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;
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码示例不是原始代码的100%转换 - lower_bound为您提供等于或大于-2.14的第一个元素.我也没有为失败添加任何检查代码 - 例如,如果lower_boundupper_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)