如何使用C++范围来实现numpy.ndindex?
How to use C++ ranges to implement numpy.ndindex?
我想在C++中实现等效的numpy.ndindex
。它应该为指定维度的多维数组生成索引。
下面是 2D 数组的实现。
template <typename T>
inline auto NDIndex(T d0, T d1) {
using namespace ranges;
return views::cartesian_product(views::indices(d0), views::indices(d1));
}
// Usage
for (const auto[i1, i2] : NDIndex(5, 4)) {
arr[i1][i2] = ...
}
我想在不牺牲性能的情况下将其推广到任意数量的维度。我可以在界面中使用大括号,例如NDIndex({5, 4})
.我可以想到多种解决方案,但我不确定哪种解决方案可以静态解决此问题。
views::cartesian_product
已经是可变的,你只需要将一个包扩展到其中。
template <typename... Ts>
inline auto NDIndex(Ts ... ds) {
using namespace ranges;
return views::cartesian_product(views::indices(ds)...);
}
// Usage
int main() {
for (const auto[i1, i2] : NDIndex(5, 4)) {
}
for (const auto[i1, i2, i3] : NDIndex(5, 4, 7)) {
}
}
这可以通过这种方式完成
#include <range/v3/view/indices.hpp>
#include <range/v3/view/cartesian_product.hpp>
template <unsigned... Ind>
constexpr inline auto NDIndex() {
using namespace ranges;
return views::cartesian_product(views::indices(Ind)...);
}
int main() {
for (const auto[i1, i2] : NDIndex<5, 4>()) {
}
for (const auto[i1, i2, i3] : NDIndex<5, 4, 7>()) {
}
}
现场示例
相关文章:
- C++返回 Numpy 数组的 Python 扩展模块
- numpy C API 中的import_array如何工作?
- 如何使用C++范围来实现numpy.ndindex?
- 传递 boost::p ython::numpy::ndarray 作为 boost::p ython 函数的(默认或非
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- Boost Python Numpy - 要初始化的未定义引用
- 如何通过 cython 将 numpy 数组列表传递给 C++
- numpy.load 给出 ValueError: descr 不是有效的 dtype 描述符:
- Pybind11 默认参数 numpy 数组或 None
- C++ - 与 Numpy 中的矢量版本相比,Argsort 效率低的矢量版本实现
- 如何使用 CMake 链接"numpy/arrayobject.h"
- 相当于numpy.exexpand_dims()和numpy.contenate()的C++
- Pybind11:在C++中使用Pybind11转换numpy数组的问题
- 使用SWIG将numpy数组元素(int)传递给c++int
- 如何在 swig 中使用 numpy.i?
- 如何将 numpy 二维数组作为一种可以用C++读取的二进制格式存储在磁盘上
- Cython:如何在不需要 GIL 的情况下从 numpy 内存视图转到矢量[对[双,双]]?
- 链接问题 boost::p ython::numpy.
- 从 numpy 数组获取指针以将图像发送到C++
- 从结构的 C 数组到带有 ctypes 的 NumPy 数组的高效转换