C++ 数组操作 (类似于 Python 的操作)

原问题提出者希望在 C++ 中找到一个类似于 Python 中 NumPy 库的库或包,以便以类似于 Python 的方式操作数组。他提供了以下 Python 代码段作为示例:
在这里插入图片描述

values  = numpy.array(inp.data)
idx1    = numpy.where(values > -2.14)
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
idx2    = numpy.where(values < 2.0)

res1 = (values[idx1] - diff1)/1000
res2 = (values[idx2] - diff2)*1000

此代码段执行以下操作:

  1. inp.data 转换为 NumPy 数组。
  2. 使用 numpy.where 函数查找数组 values 中大于 -2.14 的元素的索引,并将其存储在 idx1 中。
  3. 使用 numpy.where 函数查找数组 values 中小于 2.0 的元素的索引,并将其存储在 idx2 中。
  4. 从数组 values 中选择满足条件的元素,并按照 (values[idx1] - diff1)/1000(values[idx2] - diff2)*1000 的表达式进行计算,分别存储在 res1res2 中。

2. 解决方案

2.1 改进数据结构

提出者最先收到的一个回答者建议,不要使用数组,而是学习 std::vector 类、迭代器和标准库算法。回答者建议阅读《C++ 标准库》一书。

2.2 使用 std::setstd::vector

另一个回答者建议使用 std::setstd::vector 代替数组。std::vector 更简单,但需要对数据进行排序。使用 std::set 的话,代码如下:

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;

使用 std::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.3 使用 std::algorithmboost::lambda

还有一种方法是将 std::vectorboost::lambda 库结合起来使用,可以实现与 Python 代码段非常类似的效果。代码如下:

#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;
}
2.4 使用 NumPy 库

另一个回答者建议直接使用 NumPy 库,因为它主要是用 C 语言编写的,只需要一个 Python 包装器就可以在 C++ 中使用。

值得注意的是,这些解决方案中涉及到的一些库和方法可能需要在您的系统上进行安装和配置,请根据您的具体情况进行调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值