原问题提出者希望在 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
此代码段执行以下操作:
- 将
inp.data
转换为 NumPy 数组。 - 使用
numpy.where
函数查找数组values
中大于 -2.14 的元素的索引,并将其存储在idx1
中。 - 使用
numpy.where
函数查找数组values
中小于 2.0 的元素的索引,并将其存储在idx2
中。 - 从数组
values
中选择满足条件的元素,并按照(values[idx1] - diff1)/1000
和(values[idx2] - diff2)*1000
的表达式进行计算,分别存储在res1
和res2
中。
2. 解决方案
2.1 改进数据结构
提出者最先收到的一个回答者建议,不要使用数组,而是学习 std::vector
类、迭代器和标准库算法。回答者建议阅读《C++ 标准库》一书。
2.2 使用 std::set
或 std::vector
另一个回答者建议使用 std::set
或 std::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::algorithm
和 boost::lambda
还有一种方法是将 std::vector
和 boost::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++ 中使用。
值得注意的是,这些解决方案中涉及到的一些库和方法可能需要在您的系统上进行安装和配置,请根据您的具体情况进行调整。