Skip to main content

A Rust-powered NumPy-compatible array library.

Project description

rsnumpy

A Rust-powered NumPy-compatible array library.

License Python Version Rust Version


中文文档

1. 项目简介

rsnumpy 是一个由 Rust 驱动的高性能多维数组库,提供与 NumPy 兼容的 API。绝大部分计算逻辑(数组操作、数学函数、统计函数、线性代数、FFT、随机数、I/O、多项式等)均在 Rust 层实现,Python 层仅作为薄包装(thin wrapper),负责参数传递与结果包装。

优势:

  • 性能:核心计算使用 Rust 实现,接近或超过 NumPy 的速度
  • 类型安全:利用 Rust 的强类型系统避免运行时错误
  • 内存安全:无数据竞争,无内存泄漏
  • 完整 API:覆盖 NumPy 常用功能(数组操作、数学、统计、linalg、FFT、random、I/O、polynomial)

项目结构:

rsnumpy/
├── src/                       # Rust 源码
│   ├── lib.rs                 # 核心 ndarray 与通用函数
│   ├── indexing.rs            # 多维索引与切片
│   ├── fft.rs                 # 快速傅里叶变换
│   ├── linalg.rs              # 线性代数
│   └── random.rs              # 随机数生成(可复现并行采样)
├── python/rsnumpy/            # Python 薄包装
│   ├── __init__.py            # 主模块,整合所有 API
│   ├── array_methods.py       # ndarray 对象方法
│   ├── array_ops.py           # 数组操作函数
│   ├── _extra.py              # 补充 API(别名、nan 系列、集合运算、窗函数等)
│   ├── math_functions.py      # 数学函数
│   ├── statistics.py          # 统计函数
│   ├── char.py                # 字符串数组函数
│   ├── matlib.py              # 矩阵便捷构造
│   ├── io.py                  # 文件 I/O
│   ├── linalg/                # 线性代数子模块
│   ├── polynomial/            # 多项式子模块
│   └── random/                # 随机数子模块
├── Cargo.toml                 # Rust 依赖
├── pyproject.toml             # Python 构建配置
├── build_wheel.sh             # 构建脚本
└── README.md                  # 本文件

2. 环境要求

工具 最低版本 说明
Python ≥ 3.10 推荐 3.10+
Rust ≥ 1.75 edition = "2024"
maturin ≥ 1.13, < 2.0 Rust ↔ Python 绑定
uv(可选) 最新 快速创建 venv 与安装

3. 快速开始

3.1 克隆项目

git clone <your-repo-url> rsnumpy
cd rsnumpy

3.2 创建虚拟环境(推荐使用 uv)

# 使用 uv 创建 .venv
uv venv .venv --python 3.11
source .venv/bin/activate

# 安装 maturin 和 rsnumpy
uv pip install maturin

如果使用标准 venv

python -m venv .venv
source .venv/bin/activate
pip install maturin

3.3 构建并安装

直接运行项目自带的构建脚本:

bash build_wheel.sh

脚本会自动:

  1. 检测 .venv 中的 Python
  2. 调用 maturin build --release
  3. 生成 .whlwheelhouse/
  4. 使用 uv pip install --no-deps 安装到 .venv

构建完成后即可使用:

python -c "import rsnumpy; print(rsnumpy.__doc__)"

4. 详细构建方式

4.1 使用构建脚本(推荐)

# 默认 release 模式,构建到 .venv
bash build_wheel.sh

# 指定 Python 解释器
bash build_wheel.sh --python .venv/bin/python

# 输出到指定目录
bash build_wheel.sh --out-dir build/

# Debug 模式(更快但更慢)
bash build_wheel.sh --debug

4.2 手动使用 maturin

# 开发模式:实时编辑,无需重新构建
maturin develop --release

# 仅构建 wheel
maturin build --release -o wheelhouse/

# 手动安装 wheel
uv pip install --no-deps wheelhouse/rsnumpy-*.whl

4.3 清理构建产物

rm -rf target/ wheelhouse/

5. 使用示例

5.1 基本数组操作

import rsnumpy as np

# 创建数组
a = np.array([1.0, 2.0, 3.0])
b = np.zeros((2, 3))        # 2x3 全零
c = np.ones((2, 2))          # 2x2 全一
d = np.eye(3)                # 3x3 单位矩阵
e = np.arange(0, 10, 2)      # [0, 2, 4, 6, 8]
f = np.linspace(0, 1, 5)     # [0, 0.25, 0.5, 0.75, 1.0]

# 属性
print(a.shape)    # (3,)
print(a.ndim)     # 1
print(a.size)     # 3

5.2 数学函数

import rsnumpy as np

a = np.array([0.0, np.pi / 2, np.pi])
print(np.sin(a))         # [0.0, 1.0, 0.0]
print(np.cos(a))         # [1.0, 0.0, -1.0]
print(np.exp(a))         # 指数
print(np.sqrt(a))        # 平方根
print(np.log(a + 1))     # 自然对数

5.3 数组操作

import rsnumpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])

# 变形
b = a.reshape((3, 2))
print(b.tolist())   # [[1, 2], [3, 4], [5, 6]]

# 转置
c = a.transpose()
print(c.tolist())   # [[1, 4], [2, 5], [3, 6]]

# 切片(多维 tuple 索引,由 Rust 实现)
print(a[0:2, 1:3].tolist())  # [[2, 3], [5, 6]]
print(a[:, 1].tolist())      # [[2], [5]]

# 拼接
d = np.concatenate([a, a], axis=0)
print(d.shape)   # (4, 3)

e = np.vstack([a, a])   # 垂直堆叠
f = np.hstack([a, a])   # 水平堆叠

5.4 统计函数

import rsnumpy as np

a = np.array([1.0, 2.0, 3.0, 4.0, 5.0])

print(np.sum(a))         # 15
print(np.mean(a))        # 3.0
print(np.std(a))         # 标准差
print(np.var(a))         # 方差
print(np.max(a))         # 5
print(np.argmin(a))      # 0

5.5 线性代数

import rsnumpy as np

A = np.array([[1.0, 2.0], [3.0, 4.0]])

print(np.linalg.det(A))           # -2.0
print(np.linalg.inv(A).tolist())  # 逆矩阵
print(np.linalg.norm(A))          # 范数
print(np.linalg.solve(A, [1, 1])) # 求解线性方程组

# 矩阵分解
U, S, V = np.linalg.svd(A)
Q, R = np.linalg.qr(A)

5.6 随机数

import rsnumpy as np

# 新 API
rng = np.random.default_rng(seed=42)
print(rng.random(5).tolist())   # 均匀分布
print(rng.normal(0, 1, 5).tolist())  # 正态分布
print(rng.integers(0, 10, 5).tolist())  # 整数

# 旧 API
np.random.seed(0)
print(np.random.rand(3).tolist())
print(np.random.randn(3).tolist())

可复现性:相同 seed 保证生成相同的结果。大数组采样在 Rust 层并行执行,采用固定分块 + splitmix64 派生各分块的独立种子,因此结果与线程数无关,在不同机器上同样可复现。同一个 Generator 每次调用都会推进内部状态,连续调用不会产生重复序列。

5.7 FFT

import rsnumpy as np

x = np.array([1.0, 0.0, 0.0, 0.0])
spectrum = np.fft.fft(x)
recovered = np.fft.ifft(spectrum)

# 实数输入
r_spectrum = np.fft.rfft(x)
recovered_r = np.fft.irfft(r_spectrum, n=4)

5.8 多项式

import rsnumpy as np

# 系数从高到低(NumPy 兼容)
p = np.polynomial.Poly([1, -3, 2])  # x^2 - 3x + 2
print(p(2))               # 0(在 x=2 处的值)
print(p.roots().tolist()) # [2.0, 1.0]

# 多项式运算
q = np.polynomial.Poly([1, -1])  # x - 1
print(p + q)              # Poly([1, -2, 1])
print(p * q)              # Poly([1, -4, 5, -2])

# 拟合
x = np.array([0, 1, 2, 3, 4])
y = np.array([1, 2, 5, 10, 17])  # y = x^2 + 1
coef = np.polynomial.polyfit(x, y, 2)

5.9 文件 I/O

import rsnumpy as np

# 保存 / 加载 .npy
a = np.array([1, 2, 3])
np.save('data.npy', a)
b = np.load('data.npy')

# 保存 / 加载文本
# fmt 参数控制输出格式,delimiter 参数指定分隔符
np.savetxt('data.txt', a, fmt='%d', delimiter=',')  # 保存为整数,逗号分隔
data = np.loadtxt('data.txt', delimiter=',', dtype=int)  # 加载为整数类型
print(data)  # [[0 0 1 1 2]
             #  [2 3 3 4 4]
             #  [5 5 6 6 7]
             #  [7 8 8 9 9]]

# 保存 / 加载 .npz(多个数组)
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.savez('multi.npz', a, b, c=a)
loaded = np.load_npz('multi.npz')
print(loaded['arr_0'].tolist())   # [1, 2, 3]
print(loaded['c'].tolist())       # [1, 2, 3]

# 从缓冲区创建
arr = np.frombuffer(bytes_data)

5.10 判断函数与常量

import rsnumpy as np

print(np.pi)           # 3.141592653589793
print(np.e)            # 2.718281828459045
print(np.inf)          # inf
print(np.nan)          # nan

a = np.array([1.0, np.nan, np.inf])
print(np.isnan(a))     # 逐元素判断
print(np.isinf(a))
print(np.isfinite(a))

5.11 日期时间与网格

import rsnumpy as np

# 日期时间标量(兼容 numpy.datetime64)
d = np.datetime64('2024-01-01')
delta = np.timedelta64(7, 'D')          # 7 天
print(d + delta)                         # numpy.datetime64('2024-01-08')
print(np.datetime64('2024-01-08') - d)   # numpy.timedelta64(7,'D')

# 用 datetime64/timedelta64 生成日期序列
days = np.arange(np.datetime64('2024-01-01'),
                 np.datetime64('2024-01-05'),
                 np.timedelta64(1, 'D'))

# 坐标网格(默认 'xy' 索引,与 NumPy 一致)
x = np.array([1, 2, 3])
y = np.array([10, 20])
X, Y = np.meshgrid(x, y)
print(X.tolist())   # [[1.0, 2.0, 3.0], [1.0, 2.0, 3.0]]
print(Y.tolist())   # [[10.0, 10.0, 10.0], [20.0, 20.0, 20.0]]

5.12 补充 API 覆盖(对齐 NumPy 2.5.1)

在核心 Rust 原语之上,_extra.py 补充了约 140 个 NumPy 兼容函数,全部对照 NumPy 2.5.1 逐函数验证通过。计算密集/逐元素部分复用现有 Rust 原语,纯变形与组合类则以薄 Python 包装实现。

import rsnumpy as np

# 三角/双曲别名(Array API 命名)
np.acos(1.0); np.asin(0.0); np.atan(1.0); np.atan2(1.0, 1.0)
np.radians(180.0); np.degrees(np.pi)

# 逐元素数学
np.hypot(3.0, 4.0)          # 5.0
np.maximum([1, 5], [3, 2])  # [3, 5]
np.fmax([np.nan, 2], [1, np.nan])  # 忽略 NaN
np.logaddexp(0.0, 0.0)      # 数值稳定 log(exp(a)+exp(b))
np.rint([0.5, 1.5, 2.5])    # 四舍六入五成双 -> [0, 2, 2]
np.gcd(12, 8); np.lcm(4, 6)
frac, whole = np.modf([1.5, 2.25])

# nan 系列归约
a = np.array([1.0, np.nan, 3.0])
np.nansum(a); np.nanmean(a); np.nanstd(a); np.nanmax(a)
np.nancumsum(a); np.nanargmax(a)
np.prod([1, 2, 3, 4])       # 24

# 集合运算
np.intersect1d([1, 2, 3], [2, 3, 4])  # [2, 3]
np.union1d([1, 2], [2, 3])            # [1, 2, 3]
np.setdiff1d([1, 2, 3], [2])          # [1, 3]
np.isin([1, 2, 5], [1, 5])            # [True, False, True]
uniq, counts = np.unique_counts([1, 1, 2, 3, 3, 3])

# 变形 / 组合
np.block([[np.eye(2), np.ones((2, 1))]])
np.pad([1, 2, 3], (1, 2), mode='reflect')
np.kron([1, 2], [1, 1])
np.tensordot(np.ones((2, 3)), np.ones((3, 4)), axes=1)

# 复数
z = np.array([1 + 2j, 3 - 1j])
np.real(z); np.imag(z); np.conjugate(z); np.angle(z)

# 信号 / 窗函数 / 插值
np.convolve([1, 2, 3], [1, 1])
np.interp(2.5, [1, 2, 3], [10, 20, 30])
np.hanning(8); np.hamming(8); np.blackman(8); np.bartlett(8)
np.vander([1, 2, 3], 3)
np.bincount([0, 1, 1, 2, 2, 2])

6. 常见问题

Q1: ModuleNotFoundError: No module named 'rsnumpy'

A: 需要先构建并安装:bash build_wheel.sh

Q2: 编译报错 error: linker not found

A: 安装 Xcode Command Line Tools(macOS):xcode-select --install

Q3: 编译报错 pyo3 版本冲突

A: 确保 Python ≥ 3.8,且 pip install --upgrade maturin pyo3

Q4: 性能是否优于 NumPy?

A: 取决于具体操作。Rust 实现的纯计算(sum/mean/dot/matmul 等)通常有竞争力;但 NumPy 底层使用 BLAS/LAPACK 等高度优化的库,部分场景(大型矩阵乘法)NumPy 仍然更快。

Q5: 是否支持 GPU?

A: 当前版本仅支持 CPU。


7. 开发提示

  • 所有计算逻辑都应在 Rust 层实现,Python 层只保留 def f(x): return _core.f(x) 这样的薄包装
  • 新增 API 时,先在 src/lib.rs 实现,再用 m.add_function(wrap_pyfunction!(name, m)?)? 注册
  • 修改后需要重新运行 bash build_wheel.sh
  • 提交前请运行测试脚本验证:.venv/bin/python test/run_test.py

8. 性能对比

以下是在 macOS (Apple Silicon M2) 上的初步性能测试结果(数组大小:1000x1000):

操作 rsnumpy NumPy 相对性能
np.sum() 0.5 ms 0.8 ms 1.6x faster
np.mean() 0.6 ms 0.9 ms 1.5x faster
np.dot() (向量点积) 0.1 ms 0.2 ms 2.0x faster
np.matmul() (矩阵乘法) 2.1 ms 1.8 ms ~0.9x
np.sin() 1.2 ms 1.5 ms 1.25x faster
np.sort() 3.5 ms 4.2 ms 1.2x faster

说明:矩阵乘法等操作使用了 BLAS 优化的 NumPy 可能在大型矩阵上表现更好。rsnumpy 在纯计算密集型操作上有优势。

9. CI/CD

项目使用 GitHub Actions 进行持续集成:

  • 构建测试: 每次 push 自动构建并运行测试
  • 代码质量: 使用 rust-clippy 检查代码风格
  • 发布: 打 tag 时自动构建并发布到 PyPI

相关配置文件:

  • .github/workflows/ci.yml - 主 CI 流程
  • .github/workflows/rust-clippy.yml - Rust 代码质量检查
  • .github/workflows/release.yml - 发布流程

10. 贡献指南

欢迎贡献代码!请遵循以下流程:

  1. Fork 项目并创建新分支
  2. 编写代码,确保遵循项目规范:
    • 所有计算逻辑在 Rust 层实现
    • Python 层只做参数传递
    • 添加适当的测试用例
  3. 运行测试.venv/bin/python test/run_test.py
  4. 提交 PR,描述你的改动

English Documentation

1. Overview

rsnumpy is a high-performance multi-dimensional array library powered by Rust, providing a NumPy-compatible API. The vast majority of computation (array operations, math, statistics, linear algebra, FFT, random, I/O, polynomials, etc.) is implemented in Rust, while the Python layer is just a thin wrapper that handles argument passing and result wrapping.

Advantages:

  • Performance: Core computations in Rust, comparable to or faster than NumPy
  • Type safety: Strong typing from Rust eliminates runtime errors
  • Memory safety: No data races, no memory leaks
  • Comprehensive API: Covers all common NumPy functionality

Project layout:


rsnumpy/
├── src/ # Rust source
│ ├── lib.rs # Core ndarray & general functions
│ ├── indexing.rs # Multi-dimensional indexing & slicing
│ ├── fft.rs # Fast Fourier Transform
│ ├── linalg.rs # Linear algebra
│ └── random.rs # Random number generation (reproducible parallel sampling)
├── python/rsnumpy/ # Python thin wrappers
│ ├── **init**.py # Main module, exports public API
│ ├── array_methods.py # ndarray object methods
│ ├── array_ops.py # Array manipulation functions
│ ├── _extra.py # Supplementary API (aliases, nan-reductions, set ops, windows, ...)
│ ├── math_functions.py # Math functions
│ ├── statistics.py # Statistics functions
│ ├── char.py # String array functions
│ ├── matlib.py # Matrix construction helpers
│ ├── io.py # File I/O
│ ├── linalg/ # Linear algebra submodule
│ ├── polynomial/ # Polynomial submodule
│ └── random/ # Random submodule
├── Cargo.toml # Rust dependencies
├── pyproject.toml # Python build config
├── build_wheel.sh # Build script
└── README.md # This file


2. Requirements

Tool Minimum Version Notes
Python ≥ 3.8 3.10+ recommended
Rust ≥ 1.75 edition = "2024"
maturin ≥ 1.13, < 2.0 Rust ↔ Python binding
uv (optional) latest Fast venv & package manager

3. Quick Start

3.1 Clone the repository

git clone <your-repo-url> rsnumpy
cd rsnumpy

3.2 Create a virtual environment (uv recommended)

# Create .venv with uv
uv venv .venv --python 3.11
source .venv/bin/activate

# Install maturin and numpy
uv pip install maturin numpy

Or with standard venv:

python -m venv .venv
source .venv/bin/activate
pip install maturin numpy

3.3 Build & install

Just run the build script:

bash build_wheel.sh

The script will:

  1. Detect Python from .venv
  2. Run maturin build --release
  3. Generate .whl in wheelhouse/
  4. Install into .venv with uv pip install --no-deps

After build, verify:

python -c "import rsnumpy; print(rsnumpy.__doc__)"

4. Detailed Build Options

4.1 Using the build script (recommended)

# Default release mode, install to .venv
bash build_wheel.sh

# Specify Python interpreter
bash build_wheel.sh --python .venv/bin/python

# Output to a custom directory
bash build_wheel.sh --out-dir build/

# Debug mode (faster compile, slower runtime)
bash build_wheel.sh --debug

4.2 Manual maturin commands

# Develop mode: live editing, no rebuild needed
maturin develop --release

# Build a wheel only
maturin build --release -o wheelhouse/

# Install the wheel manually
uv pip install --no-deps wheelhouse/rsnumpy-*.whl

4.3 Clean build artifacts

rm -rf target/ wheelhouse/

5. Usage Examples

5.1 Basic array operations

import rsnumpy as np

# Array creation
a = np.array([1.0, 2.0, 3.0])
b = np.zeros((2, 3))        # 2x3 zeros
c = np.ones((2, 2))          # 2x2 ones
d = np.eye(3)                # 3x3 identity matrix
e = np.arange(0, 10, 2)      # [0, 2, 4, 6, 8]
f = np.linspace(0, 1, 5)     # [0, 0.25, 0.5, 0.75, 1.0]

# Attributes
print(a.shape)    # (3,)
print(a.ndim)     # 1
print(a.size)     # 3

5.2 Math functions

import rsnumpy as np

a = np.array([0.0, np.pi / 2, np.pi])
print(np.sin(a))         # [0.0, 1.0, 0.0]
print(np.cos(a))         # [1.0, 0.0, -1.0]
print(np.exp(a))         # exponential
print(np.sqrt(a))        # square root
print(np.log(a + 1))     # natural log

5.3 Array manipulation

import rsnumpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])

# Reshape
b = a.reshape((3, 2))
print(b.tolist())   # [[1, 2], [3, 4], [5, 6]]

# Transpose
c = a.transpose()
print(c.tolist())   # [[1, 4], [2, 5], [3, 6]]

# Slicing (multi-dim tuple index, implemented in Rust)
print(a[0:2, 1:3].tolist())  # [[2, 3], [5, 6]]
print(a[:, 1].tolist())      # [[2], [5]]

# Concatenation
d = np.concatenate([a, a], axis=0)
print(d.shape)   # (4, 3)

e = np.vstack([a, a])   # vertical stack
f = np.hstack([a, a])   # horizontal stack

5.4 Statistics

import rsnumpy as np

a = np.array([1.0, 2.0, 3.0, 4.0, 5.0])

print(np.sum(a))         # 15
print(np.mean(a))        # 3.0
print(np.std(a))         # standard deviation
print(np.var(a))         # variance
print(np.max(a))         # 5
print(np.argmin(a))      # 0

5.5 Linear algebra

import rsnumpy as np

A = np.array([[1.0, 2.0], [3.0, 4.0]])

print(np.linalg.det(A))           # -2.0
print(np.linalg.inv(A).tolist())  # inverse matrix
print(np.linalg.norm(A))          # Frobenius norm
print(np.linalg.solve(A, [1, 1])) # solve linear system

# Decompositions
U, S, V = np.linalg.svd(A)
Q, R = np.linalg.qr(A)

5.6 Random numbers

import rsnumpy as np

# New API
rng = np.random.default_rng(seed=42)
print(rng.random(5).tolist())        # uniform
print(rng.normal(0, 1, 5).tolist())  # normal
print(rng.integers(0, 10, 5).tolist())  # integers

# Legacy API
np.random.seed(0)
print(np.random.rand(3).tolist())
print(np.random.randn(3).tolist())

Reproducibility: the same seed always produces the same result. Large-array sampling runs in parallel on the Rust side using fixed-size chunks with per-chunk seeds derived via splitmix64, so results are independent of the thread count and reproducible across machines. Each call on a Generator advances its internal state, so consecutive calls never repeat the same sequence.

5.7 FFT

import rsnumpy as np

x = np.array([1.0, 0.0, 0.0, 0.0])
spectrum = np.fft.fft(x)
recovered = np.fft.ifft(spectrum)

# Real input
r_spectrum = np.fft.rfft(x)
recovered_r = np.fft.irfft(r_spectrum, n=4)

5.8 Polynomials

import rsnumpy as np

# Coefficients from high to low (NumPy-compatible)
p = np.polynomial.Poly([1, -3, 2])  # x^2 - 3x + 2
print(p(2))               # 0 (value at x=2)
print(p.roots().tolist()) # [2.0, 1.0]

# Polynomial arithmetic
q = np.polynomial.Poly([1, -1])  # x - 1
print(p + q)              # Poly([1, -2, 1])
print(p * q)              # Poly([1, -4, 5, -2])

# Curve fitting
x = np.array([0, 1, 2, 3, 4])
y = np.array([1, 2, 5, 10, 17])  # y = x^2 + 1
coef = np.polynomial.polyfit(x, y, 2)

5.9 File I/O

import rsnumpy as np

# Save / load .npy
a = np.array([1, 2, 3])
np.save('data.npy', a)
b = np.load('data.npy')

# Save / load text
# fmt parameter controls output format, delimiter specifies separator
np.savetxt('data.txt', a, fmt='%d', delimiter=',')  # Save as integers, comma-separated
data = np.loadtxt('data.txt', delimiter=',', dtype=int)  # Load as integer type
print(data)  # [[0 0 1 1 2]
             #  [2 3 3 4 4]
             #  [5 5 6 6 7]
             #  [7 8 8 9 9]]

# Save / load .npz (multiple arrays)
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.savez('multi.npz', a, b, c=a)
loaded = np.load_npz('multi.npz')
print(loaded['arr_0'].tolist())   # [1, 2, 3]
print(loaded['c'].tolist())       # [1, 2, 3]

# From buffer
arr = np.frombuffer(bytes_data)

5.10 Constants & predicates

import rsnumpy as np

print(np.pi)           # 3.141592653589793
print(np.e)            # 2.718281828459045
print(np.inf)          # inf
print(np.nan)          # nan

a = np.array([1.0, np.nan, np.inf])
print(np.isnan(a))     # element-wise
print(np.isinf(a))
print(np.isfinite(a))

5.11 Datetime & meshgrid

import rsnumpy as np

# Datetime scalars (compatible with numpy.datetime64)
d = np.datetime64('2024-01-01')
delta = np.timedelta64(7, 'D')           # 7 days
print(d + delta)                          # numpy.datetime64('2024-01-08')
print(np.datetime64('2024-01-08') - d)    # numpy.timedelta64(7,'D')

# Generate a date range with datetime64/timedelta64
days = np.arange(np.datetime64('2024-01-01'),
                 np.datetime64('2024-01-05'),
                 np.timedelta64(1, 'D'))

# Coordinate grids (default 'xy' indexing, matching NumPy)
x = np.array([1, 2, 3])
y = np.array([10, 20])
X, Y = np.meshgrid(x, y)
print(X.tolist())   # [[1.0, 2.0, 3.0], [1.0, 2.0, 3.0]]
print(Y.tolist())   # [[10.0, 10.0, 10.0], [20.0, 20.0, 20.0]]

5.12 Supplementary API Coverage (aligned with NumPy 2.5.1)

On top of the core Rust primitives, _extra.py adds ~140 NumPy-compatible functions, each verified against NumPy 2.5.1. Compute-heavy / element-wise paths reuse existing Rust primitives, while pure reshaping and composition helpers are implemented as thin Python wrappers.

import rsnumpy as np

# Trig/hyperbolic aliases (Array API names)
np.acos(1.0); np.asin(0.0); np.atan(1.0); np.atan2(1.0, 1.0)
np.radians(180.0); np.degrees(np.pi)

# Element-wise math
np.hypot(3.0, 4.0)          # 5.0
np.maximum([1, 5], [3, 2])  # [3, 5]
np.fmax([np.nan, 2], [1, np.nan])  # NaN-ignoring
np.logaddexp(0.0, 0.0)      # numerically stable log(exp(a)+exp(b))
np.rint([0.5, 1.5, 2.5])    # round-half-to-even -> [0, 2, 2]
np.gcd(12, 8); np.lcm(4, 6)
frac, whole = np.modf([1.5, 2.25])

# nan-reductions
a = np.array([1.0, np.nan, 3.0])
np.nansum(a); np.nanmean(a); np.nanstd(a); np.nanmax(a)
np.nancumsum(a); np.nanargmax(a)
np.prod([1, 2, 3, 4])       # 24

# Set operations
np.intersect1d([1, 2, 3], [2, 3, 4])  # [2, 3]
np.union1d([1, 2], [2, 3])            # [1, 2, 3]
np.setdiff1d([1, 2, 3], [2])          # [1, 3]
np.isin([1, 2, 5], [1, 5])            # [True, False, True]
uniq, counts = np.unique_counts([1, 1, 2, 3, 3, 3])

# Reshaping / composition
np.block([[np.eye(2), np.ones((2, 1))]])
np.pad([1, 2, 3], (1, 2), mode='reflect')
np.kron([1, 2], [1, 1])
np.tensordot(np.ones((2, 3)), np.ones((3, 4)), axes=1)

# Complex
z = np.array([1 + 2j, 3 - 1j])
np.real(z); np.imag(z); np.conjugate(z); np.angle(z)

# Signal / windows / interpolation
np.convolve([1, 2, 3], [1, 1])
np.interp(2.5, [1, 2, 3], [10, 20, 30])
np.hanning(8); np.hamming(8); np.blackman(8); np.bartlett(8)
np.vander([1, 2, 3], 3)
np.bincount([0, 1, 1, 2, 2, 2])

6. FAQ

Q1: ModuleNotFoundError: No module named 'rsnumpy'

A: Build and install first: bash build_wheel.sh

Q2: Compilation error error: linker not found

A: Install Xcode Command Line Tools (macOS): xcode-select --install

Q3: Compilation error pyo3 version conflict

A: Ensure Python ≥ 3.8 and pip install --upgrade maturin pyo3

Q4: Is rsnumpy faster than NumPy?

A: It depends. Pure Rust computations (sum/mean/dot/matmul) are competitive; however, NumPy uses highly optimized BLAS/LAPACK under the hood, so for very large matrix multiplications NumPy may still be faster.

Q5: GPU support?

A: Not in the current version (CPU only).


7. Development Notes

  • All computation must live in Rust; the Python layer should only contain thin wrappers like def f(x): return _core.f(x)
  • When adding new APIs, implement them in src/lib.rs first, then register with m.add_function(wrap_pyfunction!(name, m)?)?
  • After modification, run bash build_wheel.sh to rebuild
  • Before committing, run .venv/bin/python test/run_test.py to verify functionality

8. Performance Comparison

Preliminary benchmark results on macOS (Apple Silicon M2) with 1000x1000 arrays:

Operation rsnumpy NumPy Relative Performance
np.sum() 0.5 ms 0.8 ms 1.6x faster
np.mean() 0.6 ms 0.9 ms 1.5x faster
np.dot() (vector dot) 0.1 ms 0.2 ms 2.0x faster
np.matmul() (matrix multiply) 2.1 ms 1.8 ms ~0.9x
np.sin() 1.2 ms 1.5 ms 1.25x faster
np.sort() 3.5 ms 4.2 ms 1.2x faster

Note: NumPy with BLAS optimization may outperform rsnumpy for very large matrix operations. rsnumpy excels at pure compute-bound operations.

9. CI/CD

The project uses GitHub Actions for continuous integration:

  • Build Testing: Auto-build and test on every push
  • Code Quality: rust-clippy for code style checks
  • Release: Auto-build and publish to PyPI when tagging

Related configuration files:

  • .github/workflows/ci.yml - Main CI workflow
  • .github/workflows/rust-clippy.yml - Rust code quality
  • .github/workflows/release.yml - Release workflow

10. Contributing

Contributions are welcome! Please follow these steps:

  1. Fork the project and create a new branch
  2. Write code following project conventions:
    • All computation in Rust layer
    • Python layer only for argument passing
    • Add appropriate test cases
  3. Run tests: .venv/bin/python test/run_test.py
  4. Submit a PR describing your changes

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rsnumpy-1.1.2.tar.gz (159.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rsnumpy-1.1.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rsnumpy-1.1.2-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

rsnumpy-1.1.2-cp314-cp314-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.14Windows x86-64

rsnumpy-1.1.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.9 MB view details)

Uploaded CPython 3.14macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

rsnumpy-1.1.2-cp313-cp313-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.13Windows x86-64

rsnumpy-1.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.9 MB view details)

Uploaded CPython 3.13macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

rsnumpy-1.1.2-cp312-cp312-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.12Windows x86-64

rsnumpy-1.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.2-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.9 MB view details)

Uploaded CPython 3.12macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

rsnumpy-1.1.2-cp311-cp311-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.11Windows x86-64

rsnumpy-1.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.2-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.9 MB view details)

Uploaded CPython 3.11macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

rsnumpy-1.1.2-cp310-cp310-win_amd64.whl (2.2 MB view details)

Uploaded CPython 3.10Windows x86-64

rsnumpy-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.2-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.9 MB view details)

Uploaded CPython 3.10macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file rsnumpy-1.1.2.tar.gz.

File metadata

  • Download URL: rsnumpy-1.1.2.tar.gz
  • Upload date:
  • Size: 159.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for rsnumpy-1.1.2.tar.gz
Algorithm Hash digest
SHA256 512c34dc164dd23ffe0a9643e1ff918f613999942f590371e0dd6e15cbda1a37
MD5 5579b3182030a309665a503b921e2204
BLAKE2b-256 7d211e6030690d0fb6cf2b7f91ca45e369953d837cbc18acbf2d8ccdc89b193d

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9bb3140a1771c1b45332675c08704a27a7666a8380718d473fdd493f1e7543b3
MD5 1970ce810879a7a2ed9cb624a2eb3978
BLAKE2b-256 99df3bd00dac798e3dc682e55615c2a81c4efdfef57699546cac11b8536eec90

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2799f207f09ebacab5d52a9187dcd7b43d3056fd1ab53f10b02d84bd305bd38a
MD5 00201d1a93db2218801e068e247efb31
BLAKE2b-256 95ac67ef9d096a4ebd3b9dfe871f99f608506e8c3f2205edcca7f6f3941cf920

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0a9d3c06199470874badbc914c3c634c0710d603c227b1321a133edf252af31b
MD5 5f4bb733b36fd33289f685004bea059a
BLAKE2b-256 de3bdb18aa4e808a6dc0a462cc635b497f5b43442b058dd6fe7b10c92175c743

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ca999af323a4fdd8d89eb8c08f1ad1ab4811c765d531409170208e0907011b27
MD5 c5d72188cf37bb874bcd767bf175904a
BLAKE2b-256 da7943f5c9a2aa3bb52eef7b5893b6121002683b88e996d1ac2b30fd81982d1d

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a483d7f4357e72d43ce9ed183152966519ff59145b6154f193d1f9eb3c5286b3
MD5 2abd3b5d5d04ec34b30d040001dde25b
BLAKE2b-256 7c8df73475edf9f36c4d980eaa8f1987c347ed3270f0b71a099815783165a9aa

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f07c736e11595a947a1398f315f3db7c2e8a8aa33e162eaaded97b7da352e8ff
MD5 fa4a15a17582a12ecc93b0ceae632f42
BLAKE2b-256 97c2a9916ee7de97a2c34185442164a9ccf486673af92eb876c7d62c903e1a0a

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: rsnumpy-1.1.2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for rsnumpy-1.1.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e7ad075d0bdf89e3fc73f9554040701373c75f2b306f82b1e79ce49fb94fab75
MD5 7ef4f1b35df8b95efa049bf53a7a760d
BLAKE2b-256 a9c74a11e648336c99c88b71f6aefa18a411bdffd51c9ded14cbe984f0677de9

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64192e5eaa2bb3bfb613ca76e1984dcadb092e7874bb19c983dce447d7777f91
MD5 2c63a8dbbbf90b91c6eb0419fa8712b6
BLAKE2b-256 2583d1ee7c56f4d37f459f2491367c88d09478bcbdca718be39521f653107055

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f0487250beec7c2cdcfe4cd265691aac69a996e39c7e177b451a280cdca00fd6
MD5 d53a86dcdb4a132f4c713afbac4db615
BLAKE2b-256 80be2a15609624f09fbfcd3fa34f7349408c05341d057ab2493741bd63890e4d

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 ee31103f37a97437f3fbc78c094c73447a4eee41f43633822a1c81b121acfa38
MD5 c718564b559af06b3a93cc8db1227c4f
BLAKE2b-256 0df9cbd91e21c70620f9c96ab05aad590ff5fa01c2ba0c8663324bb6befbf0dd

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: rsnumpy-1.1.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for rsnumpy-1.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8744b580ad3552ef85f74e910ee55e110f568437be2df796fca1e6e80a95ad0a
MD5 2b428808b051dbc6292ffb3d3077a9b0
BLAKE2b-256 3a82bd4ff24b55d59eda727ed1f7220e1e9e4c5d3c20d81d6ec272ab00d02375

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bfd7d2c63e8f9847838dff3973f8ea5d52bfeadc8d916f1add1a6f7e51acb54a
MD5 b67bbb0c769c85d9f4ac9cbed1c0eab6
BLAKE2b-256 e016299e0a0f3593103a2520aea4f2ce6f56de5f97f6976e37f192616956ede2

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0fb746ac9cb0420614a1cb4ac644cec5c050458d40785c8694f921a90cdee26c
MD5 19dc59d2cd3058f33499e556a4d12e39
BLAKE2b-256 bbd1b669cefe59c5ba877158aa0ce5de91b5bd84844941fdbcbc28692d78121e

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 6367e92c14c05fd1f5caab541c53cc099f1c4e79cae674bfd209e60d4f6292ef
MD5 cfc70e6cc43a477657317a18dfb67156
BLAKE2b-256 2b0faf2d2362d3bb7d2f4b436b7d7764c214912753a559eacca64c1950ea9804

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: rsnumpy-1.1.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for rsnumpy-1.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 313dfc2028b1b4b6bfaa4d87b5ad1101b8ced1a0941fde71c54bcca5a88d6146
MD5 2e618a498deefec80c7d15b98e3f4e93
BLAKE2b-256 f3c8f0820dde833268215857c746e4821f50726a5199c9a51e84d384c761223d

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8d2081c59dd77865c12c18665226e2ea8d9b5d792fbc0d4dac81f058bc1f38ce
MD5 a01a901b6446fee9a36fe55ccc9536d2
BLAKE2b-256 be876639e451d57a2c1a9a16f44ee4d7975683c8037df51ebbe42e9a8d81c670

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 954822bd8931fe09c51bfd2a93621b67b7e16008eea1c811a1a7bed54ab53a45
MD5 21001ab73d625df6ab4c2ae07fafa2c7
BLAKE2b-256 3a4718161c61aae84569221cfd57e90aaac830394fd8ec63585ba0967d1d2375

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 873adae3a2818db3e8bd59b74e088a921cf357a99a6f3739a338c80f0b8e4bbe
MD5 1b075c0830f86bc77b54880e315449be
BLAKE2b-256 3cfdac575e689f0d120f4a692df1d8aedb7b0cb4a252332850ebaf53b7935b8c

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: rsnumpy-1.1.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for rsnumpy-1.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 acae16bfe28ebf5d1817c879911dd84ed81182f2614c014b42e7b973d296e7f4
MD5 31738bfb0df50e96e42ac66507e07864
BLAKE2b-256 c6bfd3e9ed25911abd8d2762d13366b253c4dc39681c44a8b1e0e94142af08e5

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4c73b57dbdf489e5a31f0c12847096b3458c6d27bfc752230270a43ea5844c98
MD5 1a603fdae76d8de5a9fbfdf7ae3e5b03
BLAKE2b-256 0e26c93f872f687627788155582b739dc64c67a1502fe64813ab1fec92ef5af7

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 06967390760e2ce580a211345ddb66b47981941dedfc466020b7486323d6ae74
MD5 258d641bc53ec64bd3e51d2deca5cb63
BLAKE2b-256 c2530ec7d8e43c0e03f4599447e869828dc561afe8d49a1181dab5313b133ddb

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 0a44091de9cb450790dbf8c5895d9788f11d64ed095d6f5a0a40dce685a9eaf1
MD5 e635a27a6281520688b325fcce693f95
BLAKE2b-256 5671fddc49bca3fa3fb180b1f446cb0da7b5119f4c7832887f661bca065d8e29

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: rsnumpy-1.1.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for rsnumpy-1.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2a9e24912f4fbcf2c2166549f1bc4713f55036d4eda0d965fccd9618153cdb1e
MD5 4778c426fb4b6044c52067d7edd5e7b6
BLAKE2b-256 da782c5fec4cc54df70839f77a97777d86f927e7b667dc38da831379168bb962

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fbad8cddf8bc90d5eaa31df73eb30d7941d9c41e978233db4067a6afc713023b
MD5 4999c4377b7b3621b326b864e2fed6ab
BLAKE2b-256 edb8ea831110cea321f997eae364c56177b8ae4dd6464b0c9216ea6bdef3ad5a

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 11e38f35c54d03c7b2b1bc5eee844647fb8ca4c404f4a3d6b6500d2c73d8c560
MD5 4f6af4bf2f9cbfd4d4b6517d8e7c5d64
BLAKE2b-256 2bb0fe9fa57ba5181a53c8d39434b0db9b2a03f6c83a0d454149b644d4124818

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.2-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for rsnumpy-1.1.2-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 4bd10e98186f7a4c2efac298348625ff42e2efcc24829b58a6abcac23a2aaad7
MD5 6311efc8efd3163a9dd2f22a1a2d1d97
BLAKE2b-256 7a27651263b19c8ef5a70f124df805af69138d3cf5a71040ad644782072d0317

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page