xtensor-stack 开源组织全解析:背景、核心项目、使用教程
·
文章目录
xtensor-stack 开源组织全解析:背景、核心项目、使用教程
一、xtensor-stack 组织整体介绍
1. 基本背景
xtensor‑stack 是由法国数据分析公司 QuantStack 主导维护的一套现代 C++ 数值计算生态开源组织,对标 Python NumPy、MATLAB、Eigen,但更侧重现代 C++、向量化 SIMD、零开销抽象、跨平台、高性能科学计算。
- 官网:https://github.com/xtensor-stack
- 核心定位:把 Python 式简单易用的数组语法,搬到高性能 C++,兼顾易用性 + 极致性能
- 特点:全头文件库、无第三方依赖、C++14/17 起步、跨平台(x86/ARM/RISC‑V/Windows/Linux/macOS)、深度集成 xsimd SIMD 向量化
- 主要应用:科学计算、数据分析、机器学习、数值模拟、图像处理、金融量化、HPC 高性能计算
2. 整体生态关系
xtl(基础工具库)
├─ xsimd(SIMD 向量化加速库)
├─ xtensor(多维数组核心库,对标 NumPy)
│ ├─ xtensor‑blas(BLAS/LAPACK 线性代数)
│ ├─ xtensor‑io(文件读写:CSV/HDF5)
│ ├─ xtensor‑py(C++ ↔ Python NumPy 无缝互通)
│ └─ xtensor‑math(数学函数、随机数、统计)
└─ xeus(交互式 C++ Jupyter 内核)
二、核心项目逐个介绍 + 最简使用示例
下面按依赖层级从底层到上层,逐个讲作用 + 特点 + 代码示例
1. xtl:底层基础工具库
- 仓库:https://github.com/xtensor-stack/xtl
- 定位:整个栈的基础工具集,提供类型萃取、元编程、视图、可选值、容器工具、编译期计算等
- 特点:纯头文件、无依赖、轻量,上层所有库都依赖它
- 一般不单独使用,写上层项目自动依赖即可
2. xsimd:SIMD 向量化库
- 仓库:https://github.com/xtensor-stack/xsimd
- 定位:跨平台 CPU 向量化加速,屏蔽 AVX2/AVX‑512/NEON/RISC‑V 差异
- 作用:给 xtensor 提供硬件级批量计算加速
- 核心类型:
xsimd::batch<T>,一次运算处理多个数据 - 简单示例(回顾)
#include <xsimd/xsimd.hpp>
int main() {
using b = xsimd::batch<double>;
b a = b{1,2,3,4}, b = b{5,6,7,8};
auto c = a + b; // 自动SIMD向量化加法
return 0;
}
3. xtensor:核心多维数组库(对标 Python NumPy)
项目信息
- 仓库:https://github.com/xtensor-stack/xtensor
- 定位:C++ 版 NumPy,多维数组、广播、切片、视图、向量化运算
- 最大优势:
- 语法极度接近 Python NumPy,学习成本极低
- 自动调用 xsimd 做 SIMD 加速,性能碾压普通循环
- 支持静态维度 / 动态维度两种数组
- 广播、切片、reshape、view、迭代器全部支持
两种数组类型
xtensor::xtensor<T, N>:动态维度(运行时可改形状,最常用)xtensor::xtensor_fixed<T, shape>:静态维度(编译期定形状,性能更高)
最简使用示例
#include <xtensor/xtensor.hpp>
#include <xtensor/xio.hpp> // 打印数组
#include <xtensor/xview.hpp> // 切片视图
int main() {
// 1. 创建 2×3 二维数组
xt::xtensor<double, 2> arr = {{1,2,3}, {4,5,6}};
// 2. 简单运算(自动广播+SIMD向量化)
auto arr2 = arr + 2;
auto arr3 = arr * arr2;
// 3. 切片(和NumPy完全一样)
auto slice = xt::view(arr, xt::all(), xt::range(0,2));
// 4. 打印
std::cout << arr << "\n" << arr2 << "\n" << slice;
return 0;
}
CMake 集成 xtensor
find_package(xtensor REQUIRED)
add_executable(demo main.cpp)
target_link_libraries(demo xtensor)
编译必须开启 SIMD:
g++ -std=c++17 -O3 -march=native main.cpp -o demo
4. xtensor‑py:C++ 与 Python NumPy 无缝互通
- 仓库:https://github.com/xtensor-stack/xtensor‑py
- 定位:C++ xtensor 数组 ↔ Python NumPy 数组零拷贝转换
- 用途:写高性能 C++ 扩展,替代 pybind11+手动内存拷贝,直接操作 NumPy 内存
- 典型场景:Python 里调用 C++ 数值计算,数据不复制,极速
5. xtensor‑blas / xtensor‑lapack:线性代数
- 仓库:https://github.com/xtensor-stack/xtensor‑blas
- 作用:矩阵乘法、求逆、SVD、特征值,对接 OpenBLAS/MKL/LAPACK
- 比 Eigen 更易用,语法更像 NumPy
6. xtensor‑io:文件读写
- 仓库:https://github.com/xtensor-stack/xtensor‑io
- 支持:CSV、HDF5、npy/npz(NumPy 格式)
- 直接读写 NumPy 保存的数组,科研数据互通非常方便
7. xeus:交互式 C++ Jupyter 内核
- 仓库:https://github.com/xtensor-stack/xeus
- 定位:在 Jupyter Notebook 里直接写 C++,像 Python 一样交互式运行
- 配合 xtensor,可直接在 Notebook 做 C++ 科学计算、画图
8. 其他常用项目
- xtensor‑math:随机数、正态分布、统计函数、三角函数、特殊数学函数
- xtensor‑signal:信号处理、滤波、卷积
- xtensor‑optimize:数值优化、最小二乘、梯度下降
三、整体使用流程(快速上手)
1. 安装方式(任选)
方式1:vcpkg(Windows/Linux/macOS 最简单)
vcpkg install xtensor xsimd xtensor-blas xtensor-py
方式2:CMake FetchContent(项目内一键拉取)
include(FetchContent)
FetchContent_Declare(xtensor
GIT_REPOSITORY https://github.com/xtensor-stack/xtensor.git
GIT_TAG master
)
FetchContent_MakeAvailable(xtensor)
方式3:手动下载头文件
直接 clone 对应仓库,把 include 加入头文件路径
2. 完整最小可运行项目(xtensor + xsimd)
#include <xtensor/xtensor.hpp>
#include <xtensor/xrandom.hpp>
#include <xtensor/xio.hpp>
int main() {
// 随机生成 1000×1000 数组,自动SIMD加速
xt::xtensor<double, 2> a = xt::random::rand<double>({1000, 1000});
xt::xtensor<double, 2> b = xt::random::rand<double>({1000, 1000});
// 矩阵逐元素乘法,自动向量化
auto c = a * b;
std::cout << "数组形状:" << c.shape() << std::endl;
return 0;
}
3. 编译命令(必须开启优化与SIMD)
g++ -std=c++17 -O3 -march=native main.cpp -o xtensor_demo
-O3:开启最高优化-march=native:启用本机 CPU 最高 SIMD 指令(AVX2/AVX512)
四、和 Eigen、NumPy 对比总结
| 库 | 语言 | 易用性 | 性能 | 特点 |
|---|---|---|---|---|
| NumPy | Python | ⭐⭐⭐⭐⭐ | 一般(依赖底层C) | 生态最强 |
| Eigen | C++ | ⭐⭐⭐ | 高 | 传统线性代数库 |
| xtensor+xsimd | C++ | ⭐⭐⭐⭐ | 极高(SIMD) | 语法像NumPy,性能像手写SIMD |
五、适合人群 & 场景
- 做科学计算、数值模拟、CFD、HPC,需要 C++ 高性能
- 写 Python 扩展,不想手写内存拷贝,用 xtensor‑py 零拷贝对接 NumPy
- 从 Python NumPy 转 C++,希望语法几乎不变
- 需要跨平台,自动适配不同 CPU 的 SIMD 指令
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)