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.3.tar.gz (170.7 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.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

rsnumpy-1.1.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

rsnumpy-1.1.3-cp314-cp314-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.14Windows x86-64

rsnumpy-1.1.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.3-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (4.3 MB view details)

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

rsnumpy-1.1.3-cp313-cp313-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.13Windows x86-64

rsnumpy-1.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.3-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (4.3 MB view details)

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

rsnumpy-1.1.3-cp312-cp312-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.12Windows x86-64

rsnumpy-1.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.3-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (4.3 MB view details)

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

rsnumpy-1.1.3-cp311-cp311-win_amd64.whl (2.5 MB view details)

Uploaded CPython 3.11Windows x86-64

rsnumpy-1.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.3-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (4.3 MB view details)

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

rsnumpy-1.1.3-cp310-cp310-win_amd64.whl (2.5 MB view details)

Uploaded CPython 3.10Windows x86-64

rsnumpy-1.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rsnumpy-1.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

rsnumpy-1.1.3-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (4.3 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.3.tar.gz.

File metadata

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

File hashes

Hashes for rsnumpy-1.1.3.tar.gz
Algorithm Hash digest
SHA256 4205bf9724dfbef9b8068ec8257dc23e7d4f9cdba0253c9b9d4e848c39bb51d6
MD5 51861fdf97e6d6888043377cd3ae55be
BLAKE2b-256 3575fba58cd805bc27d44a9767099bc61d2fc941f662e32c45bfab304d63f6b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cad01fad5425fb93f18f7ad8c864b1b1f081f624f51305fb9dcf94954c51f3af
MD5 e948e00da7d7ecbb96e9f7c119e6e2d0
BLAKE2b-256 f2589c66116d9e62077b7fac7431269c24462617329290ad9f90a641b1c3826f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 88be07a01c755e6c8d9c53db14b196dffe5d167a0c64ff104960b11914f995fe
MD5 12d749b0a6dbd531c23c699180a60f0e
BLAKE2b-256 169387449ff173a8f7a1bd9d8529447f9eb53dd1ab4beff234c396b522fd17ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fed8769accd0133b7cd25bff273649fcbe4a940c4e8ac87850d6d761ea6ef94d
MD5 c9b46845241ee71962a5478c5a0042cd
BLAKE2b-256 29290d434aa61f21235b1f4b0dc89bb06250061665be50cfc7190ad8d58f4c59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 eb5d410cbd247ab206584f029ede10f460237d71a91ebd6bdc2503b7216c73cc
MD5 be19ea0d0f091965e358253ac5383b45
BLAKE2b-256 102ac7c1c2f43731066edbdc14b3064f7e600e0f9d1957de9c5a4eeea78b514f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6ee9278ba6284a42c3ec9f79e2b54ed336bcd2b1ee3b6e099e5b724f380bf7f2
MD5 c7f469c3ab6b541cca92c06a9eae8a5d
BLAKE2b-256 ebaed1ce177035d002ddde116dce1c2ea3e746f83ef3c710041b758162d7b3e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 36e5dca8f9277e4947f3fac20bc596b8e5a198779d030862f142e7d7669acd19
MD5 2eaa190a5129852d4ec48a72960347e1
BLAKE2b-256 818976c4b50ac15954b3779af3ea9e1d9050c2e52f658dd10ffa61c354f70131

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rsnumpy-1.1.3-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 2.4 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.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 72ee5f818d1a9581b6be3267ce791c38f236800eeeab2d2e438d9028e3a6b0cd
MD5 3c17a96bf25c8f4d79c05cff1729544b
BLAKE2b-256 fb5912149b90461414093ce2cde035717d014bb15e4751be40ea48f82c4f21cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bd0331b58ac8aac484a95192c8a078faa3e82fd63cd47e41e8941c5a5870709a
MD5 9f648a38b7d43cf9967b9d79b5063fa0
BLAKE2b-256 82c237b2e75ae96ddd80344a68966a3d8743ecbd8dffbfa2f54bd839740bf52b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c00cd31dde72023c05221901783bc4d0e38b8ef7f51fc64f913bf0f7046ec75f
MD5 0ceb9c5bc7d6d5847169121179cdbad6
BLAKE2b-256 834a74110dab3673b5e46c50488a62503dfaf29d42ef683d6867b6dbbade178a

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.3-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.3-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 0ba621c37a3c5c3ec325e0c1d3e1e83dc9be88b924277f603b961b7fdfdd5be0
MD5 9e3559993c623252a8a05d773e11d1eb
BLAKE2b-256 ef270c04854b5cafc5b2b06ca4d31f05572dac905e9d7bc63491cfa05a8387b2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rsnumpy-1.1.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 2.4 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.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cab29c910506e713193b346dc537c3473dac03aa6fb62faf7a3aa89860e7381e
MD5 23f8d9691d1c4c3144f28f353efd17f4
BLAKE2b-256 7dc923721ef6a5b603b1b511840bce15e709d998f4d7827bda8e1014ae5f7bf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 79d4bba6de3db63501cc98d8c9a23f41301dfd24ddd549c311d170b50bee9566
MD5 8183dab028f52d729ee586fa4e41a27a
BLAKE2b-256 09abb47f04e340c4ceb064df39672fc18d2001140482ff718872106e6ddb4f5d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c16b239f9505a7a3ff366eaa3d5ec22a24ffb587e648f002ca1cae1c25e3ff5e
MD5 233b251e0cf09a5cb35c4d42267cb8cf
BLAKE2b-256 19574bfd9ad7eb43b03741eb6788861bde0e16dd8e9fcf11efb388a3c02469a4

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.3-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.3-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 445e6951b24158b4059957370dfc32790e00f98f0200093d082bcf3a7d661cf9
MD5 6f7a09579bd62271280806dee4ea9698
BLAKE2b-256 0d7fc0a9d3f430f97a7cfef33bc5271084c2efa2b82d1ef206cbf5150db76adf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rsnumpy-1.1.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 2.4 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.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 73edacaea0878fa583213f2c4611d8332d835881faf2200e633a2736db755c6b
MD5 5bb44d1cc897eae99f1b7b3b462017b7
BLAKE2b-256 93aab7c4b1fe49590134a9c409794cffab42324c471027d3f4dabe7f60851180

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 27710588a55366108acdaf9af72fba8769330dd82fab52f64fbc33473ac05d87
MD5 7d8d846a1d288ec7a0b405ff08bec297
BLAKE2b-256 7533ab1253138bbb46ba38b50373eda77d8ef2ac5928c0f62de1da0c1d75b295

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 41260a2e10e46aca305dac7b45960db6700ab5aa7f406d82c39087b9fe65006c
MD5 9d80c7063218dee321bd5aacd880176c
BLAKE2b-256 a02f7bc30904f6971f3f705b6e00c41716b534af8162379e13f05744a0ed8b05

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.3-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.3-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 09534a865898b8189d4b4f084f1f4a6a4f43c3be8fe7ca85806355fb97d6942c
MD5 9d3e7b9b59ac952192574e3903830cdb
BLAKE2b-256 02afc9da9ef4ba1f5e8b9834ee0942ba28605be1424c465b00408711ad2174c2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rsnumpy-1.1.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 2.5 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.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 21279ddf813595d2087a38491f164290ad976fa09800a93f7d3a672f9dc313ed
MD5 8e0e6470ed9ce2ff861bfe7d70ca54bf
BLAKE2b-256 4ad4f59eff14bd1bfd1dfddfc7930b199b68bb5af2beef10253d1089ded88b05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3e35f0e1448ec2ffc031b9811e3a3737fabf10b59530e279a30d68c263cade83
MD5 f31392018db957270bb1654433fcb721
BLAKE2b-256 6cd3059aa2664f0c3825bc5ae5a86eae1b0735d7580401277c464f9f10f69701

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0e1a1ceb08fe294df2ad510d6551de3fac05f48f876deb4330a29337db702aae
MD5 fabe27aa822195f5973ce2a67a7b97cb
BLAKE2b-256 4be8f7bcf01b8cc2df246f58e3d2ca3ef16961fbb770c9420856697d3a7e7b9a

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.3-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.3-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 db7e1379e4811349cc2adb417eafa809c1af018627272d84cb6a1b892c3a993c
MD5 55e78f125dc7c11040facc488252db2c
BLAKE2b-256 ff1e05636e279e06cab3af424fdd476f87497050c560922f9743dc13d2f866ae

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rsnumpy-1.1.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 2.5 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.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2350e947b66dd388a6cc31add065912dad7dd67399248f6bfee510d2ecbbad25
MD5 bbd56b1fa0c115f0b1fab72010471cf3
BLAKE2b-256 1bc6355d517018581b7310d8f15c93843f4491ea2f1880b72443090779d492f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6186c45f075eaaf760c6a055d26a909613b08873c63af1e8a6786570efb09044
MD5 e4b9427456a8a6dea7ba2482e938fabf
BLAKE2b-256 45ddf70c6048d52f6cd56d298d641d9e339b8df5a5cbbd5f8188bbbb570b23f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rsnumpy-1.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c69b2f96668fdb5dbe68d3b12160360e8a85ab05e8fd8e05e43de35a1aaad4af
MD5 7b747cf996923d122db8dcee60954d91
BLAKE2b-256 075d3704496f3207ab23031b758b02fd0cef9aeb867227e5631347892d7c3746

See more details on using hashes here.

File details

Details for the file rsnumpy-1.1.3-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.3-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 77880326fab71ad5858d8cb6e2c6a276e626564551df3a41ff617d0e3231a137
MD5 748c40ec7934f6396767c047e9728c3e
BLAKE2b-256 516588d4bd96db3806e8d3eed11beddeeb59ddb9fdf328acc6255b94fc7d2b1f

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