# tinyndarray
**Repository Path**: edidada/tinyndarray
## Basic Information
- **Project Name**: tinyndarray
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-07-08
- **Last Updated**: 2025-07-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# TinyNdArray
C++ 实现的 NumPy NdArray。
期待您的 Pull Request。
## 要求
* C++14 编译器
## 示例代码
```cpp
#include "tinyndarray.h"
using tinyndarray::NdArray;
using tinyndarray::DataType;
int main() {
// 创建整型数组
auto int_arr = NdArray(DataType::INT, {2, 3}, {1, 2, 3, 4, 5, 6});
std::cout << "整型数组:\n" << int_arr << std::endl;
// 创建双精度浮点数组
auto double_arr = NdArray(DataType::DOUBLE, {3}, {1.5, 2.5, 3.5});
std::cout << "双精度数组:\n" << double_arr << std::endl;
// 混合类型运算
auto result = int_arr + double_arr;
std::cout << "混合类型运算结果:\n" << result << std::endl;
return 0;
}
```
## 使用说明
在CMakeLists中作为子项目引入:
```bash
add_subdirectory(tinyndarray)
target_link_libraries(demo PRIVATE tinyndarray)
```
## 快速指南
TinyNdArray 支持多种数据类型:`FLOAT`, `INT`, `DOUBLE`。
以下示例中,C++ 代码假设已声明 `using namespace tinyndarray;`。
### 数据类型支持
| 数据类型 | C++ 类型 | 枚举值 |
|----------|----------|---------------|
| 浮点数 | float | DataType::FLOAT |
| 整数 | int | DataType::INT |
| 双精度 | double | DataType::DOUBLE|
### 复制行为
NdArray 的复制行为是浅拷贝,与 NumPy 相同。
Numpy (Python) |
TinyNdArray (C++) |
a = np.ones((2, 3))
b = a
b[0, 0] = -1
print(a[0, 0]) # -1
|
auto a = NdArray::Ones(DataType::FLOAT, {2, 3});
auto b = a;
b[{0, 0}] = -1;
std::cout << a[{0, 0}] << std::endl; // -1
|
### 基础构造
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `a = np.array([2, 3])` | `NdArray a(DataType::INT, {2}, {2, 3});` |
| | `NdArray a = {2, 3}; // 默认为FLOAT类型` |
### 初始化器(支持多种类型)
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `a = np.array([1.0, 2.0])` | `NdArray a = {1.0f, 2.0f}; // FLOAT类型` |
| `a = np.array([[1.0, 2.0]])` | `NdArray a = {{1.0f, 2.0f}};` |
| `a = np.array([[1,2],[3,4]])` | `NdArray a(DataType::INT, {{1,2}, {3,4}});` |
| `a = np.array([[[[1.5,2.5]]]])` | `NdArray a = {{{{1.5, 2.5}}}}; // 4维数组` |
### 静态初始化
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `a = np.empty((2,3))` | `auto a = NdArray::Empty(DataType::FLOAT, {2,3});` |
| `a = np.zeros((2,3))` | `auto a = NdArray::Zeros(DataType::INT, {2,3});` |
| `a = np.ones((2,3))` | `auto a = NdArray::Ones(DataType::DOUBLE, {2,3});` |
| `a = np.arange(10)` | `auto a = NdArray::Arange(DataType::INT, 10);` |
| `a = np.arange(0,100,10)` | `auto a = NdArray::Arange(DataType::INT, 0,100,10);`|
### 随机初始化
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `a = np.random.uniform(size=10)` | `auto a = NdArray::Uniform(DataType::FLOAT, {10});` |
| `a = np.random.uniform(size=(2,10))` | `auto a = NdArray::Uniform(DataType::FLOAT, {2,10});`|
| `a = np.random.uniform(0.0,1.0,10)` | `auto a = NdArray::Uniform(0.0f,1.0f, {10});` |
| `a = np.random.normal(size=10)` | `auto a = NdArray::Normal(DataType::FLOAT, {10});` |
| `a = np.random.normal(0.0,1.0,10)` | `auto a = NdArray::Normal(0.0f,1.0f, {10});` |
### 随机种子
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.random.seed()` | `NdArray::Seed();` |
| `np.random.seed(0)` | `NdArray::Seed(0);` |
### 基本内置方法
| **Numpy (Python)** | **TinyNdArray (C++)** |
|--------------------|----------------------------|
| `id(a)` | `a.id()` |
| `a.size` | `a.size()` |
| `a.shape` | `a.shape()` |
| `a.ndim` | `a.ndim()` |
| `a.fill(2.0)` | `a.fill(2.0f); // FLOAT` |
| | `a.fill(2); // INT` |
| `a.copy()` | `a.copy()` |
### 原始内置方法
| **Numpy (Python)** | **TinyNdArray (C++)** |
|--------------------|----------------------------|
| --- | `a.empty()` |
| --- | `a.data_ptr()` |
| --- | `a.begin()` |
| --- | `a.end()` |
### 单元素类型转换
| **Numpy (Python)** | **TinyNdArray (C++)** |
|--------------------|----------------------------|
| `float(a[0])` | `static_cast(a(0));`|
| `int(a[0])` | `static_cast(a(0));` |
### 索引访问
| **Numpy (Python)** | **TinyNdArray (C++)** |
|--------------------|----------------------------|
| `a[2, -3]` | `a({2, -3})` 或 `a(2, -3)` |
### 形状变换方法
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------|----------------------------------|
| `a.reshape(-1, 2, 1)` | `a.reshape({-1, 2, 1});` |
| `a.flatten()` | `a.flatten();` |
| `a.ravel()` | `a.ravel();` |
### 形状变换函数
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------|----------------------------------|
| `np.reshape(a, (-1,2,1))` | `Reshape(a, {-1,2,1});` |
| `np.squeeze(a)` | `Squeeze(a);` |
| `np.expand_dims(a, 1)` | `ExpandDims(a, 1);` |
### 切片
| **Numpy (Python)** | **TinyNdArray (C++)** |
|------------------------|----------------------------------|
| `a[1:5, -4:-1]` | `a.slice({{1,5}, {-4,-1}});` |
### 打印
| **Numpy (Python)** | **TinyNdArray (C++)** |
|------------------------|----------------------------------|
| `print(a)` | `std::cout << a << std::endl;` |
### 单目运算符
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------|----------------------------------|
| `+a` | `+a` |
| `-a` | `-a` |
### 算术运算符
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `a + b` | `a + b` // 支持混合类型 |
| `a - b` | `a - b` |
| `a * b` | `a * b` |
| `a / b` | `a / b` |
| `a + 2.0` | `a + 2.0f` |
| `2.0 * a` | `2.0f * a` |
### 比较运算符
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `a == b` | `a == b` // 返回布尔数组 |
| `a > b` | `a > b` |
| `a == 1.0` | `a == 1.0f` |
| `1.0 < a` | `1.0f < a` |
### 复合赋值运算符
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `a += b` | `a += b` |
| `a *= 2.0` | `a *= 2.0f` |
### 数学函数
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.abs(a)` | `Abs(a)` |
| `np.sin(a)` | `Sin(a)` |
| `np.power(a, 2.0)` | `Power(a, 2.0f)` |
| `np.power(2.0, a)` | `Power(2.0f, a)` |
### 轴函数(归约操作)
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.sum(a)` | `Sum(a)` |
| `np.sum(a, axis=0)` | `Sum(a, {0})` |
| `np.mean(a, axis=0)` | `Mean(a, {0})` |
### 逻辑函数
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.all(a)` | `All(a)` |
| `np.any(a)` | `Any(a)` |
| `np.where(cond, x, y)` | `Where(cond, x, y)` |
### 轴方法(归约操作)
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `a.sum()` | `a.sum()` |
| `a.sum(axis=0)` | `a.sum({0})` |
| `a.min(axis=0)` | `a.min({0})` |
### 组合函数
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.stack([a,b], axis=0)` | `Stack({a, b}, 0);` |
| `np.concatenate([a,b], axis=0)` | `Concatenate({a, b}, 0);` |
### 视图变换函数
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.transpose(a)` | `Transpose(a);` |
| `np.broadcast_to(a, (3,2))` | `BroadcastTo(a, {3,2});` |
### 文件I/O
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.load('m.npy')` | `Load("m.npy");` |
| `a.save('m.npy')` | `a.Save("m.npy");` |
### 矩阵乘积
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.dot(a, b)` | `Dot(a, b);` |
| `a.dot(b)` | `a.dot(b);` |
### 逆矩阵
| **Numpy (Python)** | **TinyNdArray (C++)** |
|----------------------------------------|-----------------------------------------------------|
| `np.linalg.inv(a)` | `Inv(a);` |
### 算术运算
支持广播和混合类型:
```cpp
auto int_arr = NdArray::Ones(DataType::INT, {2, 3});
auto float_arr = NdArray::Ones(DataType::FLOAT, {3});
auto result = int_arr * float_arr; // 结果为FLOAT类型
```
### 矩阵运算
```cpp
auto a = NdArray::Ones(DataType::FLOAT, {3, 4});
auto b = NdArray::Ones(DataType::FLOAT, {4, 5});
auto c = a.dot(b); // 矩阵乘法
```
### 归约操作
```cpp
auto arr = NdArray::Arange(DataType::INT, 12).reshape(3, 4);
auto sum_all = arr.sum(); // 所有元素求和
auto sum_axis0 = arr.sum({0}); // 沿0轴求和
```
### 并行执行
默认情况下,大多数操作使用多线程并行执行。
```cpp
// 使用所有核心(默认)
NdArray::SetNumWorkers(-1);
// 使用4个核心
NdArray::SetNumWorkers(4);
// 禁用并行
NdArray::SetNumWorkers(1);
```
## 待实现功能
* [ ] 优化轴归约算法
* [ ] 实现引用切片(无拷贝)
* [ ] 引入SIMD指令优化
* [ ] 改进矩阵求逆算法(LU分解)
## 贡献指南
欢迎提交 Pull Request!请确保:
1. 代码符合C++14标准
2. 添加相应的单元测试
3. 更新文档和示例
## 许可证
MIT 许可证