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

时间:2010-03-24 12:05:50

标签: 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

在python中它只有5行,但我能想到的C ++中最简单的方法是很多嵌套循环。请指教..

基本上我的问题是数组/向量操作,如数组乘法,索引操作等。在上面的例子中,res1是一个数组,包含一组从values数组中过滤掉的元素,后来应用了一些算术(减法,所有选定元素的乘法)。在这个python示例中,我不是复制values数组的元素,因为它在内存方面可能足够大,我只保留索引并希望能够对原始数组的一组选定元素运行算术运算

5 个答案:

答案 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_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;

答案 2 :(得分:4)

我建议您检查算法标题。 也不使用数组,你有std :: vector或boost(很快就是std):: array。

wikipedia article

Reference for all algorithms

答案 3 :(得分:1)

如果我没弄错的话,numpy主要是用C语言编写的(带有Python包装器),所以你可以直接从C ++中使用它而不费力。

答案 4 :(得分:1)

如果你合并std::vectorboost::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;
}