Skip to main content

A high-performance array storage and manipulation library

Project description

NumPack

A high-performance NumPy array storage library combining Rust's speed with Python's simplicity. Optimized for frequent read/write operations on large arrays, with built-in SIMD-accelerated vector similarity search.

Highlights

Feature Performance
Row Replacement 344x faster than NPY
Data Append 338x faster than NPY
Lazy Loading 51x faster than NPY mmap
Full Load 1.64x faster than NPY
Batch Mode 21x speedup
Writable Batch 92x speedup

Core Capabilities:

  • Zero-copy mmap operations with minimal memory footprint
  • SIMD-accelerated Vector Engine (AVX2, AVX-512, NEON, SVE)
  • Batch & Writable Batch modes for high-frequency modifications
  • Supports all NumPy dtypes: bool, int8-64, uint8-64, float16/32/64, complex64/128

Installation

Python

pip install numpack

Requirements: Python ≥ 3.9, NumPy ≥ 1.26.0

Rust

Add to your Cargo.toml:

[dependencies]
numpack = "0.5.1"
ndarray = "0.16"

Features:

  • rayon (default) - Parallel processing support
  • avx512 - AVX-512 SIMD optimizations
  • io-uring-support - io_uring on Linux

Requirements: Rust ≥ 1.70.0

Build from Source
# Prerequisites: Rust >= 1.70.0 (rustup.rs), C/C++ compiler
git clone https://github.com/BirchKwok/NumPack.git
cd NumPack
pip install maturin>=1.0,<2.0
maturin develop  # or: maturin build --release

Basic Usage

use numpack::prelude::*;
use ndarray::{ArrayD, Array2, IxDyn};
use std::path::PathBuf;

fn main() -> NpkResult<()> {
    // Create or open a NumPack storage
    let io = ParallelIO::new(PathBuf::from("data.npk"))?;
    
    // Save arrays with explicit dtype
    let data = Array2::<f32>::from_shape_fn((1000, 128), |(r, c)| (r * 128 + c) as f32);
    io.save_arrays(&[("embeddings".to_string(), data.into_dyn(), DataType::Float32)])?;
    
    // Load array back (mmap-based, with automatic cache)
    let loaded: ArrayD<f32> = io.load_array("embeddings")?;
    assert_eq!(loaded.shape(), &[1000, 128]);
    
    // In-place append (file append mode, no rewrite)
    let extra = Array2::<f32>::ones((50, 128)).into_dyn();
    io.append_rows("embeddings", &extra)?;
    assert_eq!(io.get_shape("embeddings")?, vec![1050, 128]);
    
    // Metadata is written on drop, or call sync_metadata() explicitly
    io.sync_metadata()?;
    
    Ok(())
}

API Reference

Storage Operations:

Method Description
ParallelIO::new(path) Create or open a storage directory
save_arrays(&[(name, array, dtype)]) Save one or more arrays (auto-parallel for large data)
sync_metadata() Persist metadata to disk
reset() Delete all arrays and metadata

Read Operations (mmap-based):

Method Description
load_array::<T>(name) Load full array via mmap with automatic cache
getitem::<T>(name, &indexes) Read specific rows by index (supports negative indexing)
read_rows(name, &indexes) Read specific rows as raw bytes
stream_load::<T>(name, buffer_size) Streaming iterator yielding batches of rows
get_array_view(name) Get a lazy array view (mmap-backed)

Write Operations (in-place):

Method Description
append_rows::<T>(name, &data) In-place append to existing array (file append mode)
replace_rows::<T>(name, &data, &indices) In-place row replacement with pwrite
clone_array(source, target) Deep copy an array to a new name

Delete & Compact:

Method Description
drop_arrays(name, Some(&indices)) Logical delete rows (bitmap-based)
drop_arrays(name, None) Physical delete entire array
compact_array(name) Remove logically deleted rows, reclaim space

Metadata & Query:

Method Description
has_array(name) Check if an array exists
list_arrays() / get_member_list() List all array names
get_array_metadata(name) Get array metadata (shape, dtype, size, etc.)
get_shape(name) Get logical shape (accounts for deletions)
get_modify_time(name) Get last modification timestamp (microseconds)

Aliases (Python API compatible):

Rust Method Python Equivalent
append_rows() NumPack.append()
load_array() NumPack.load()
getitem() NumPack.getitem()
get_shape() NumPack.get_shape()
get_modify_time() NumPack.get_modify_time()
clone_array() NumPack.clone()
get_member_list() NumPack.get_member_list()
update() NumPack.update()
stream_load() NumPack.stream_load()

Array Operations:

use numpack::prelude::*;
use ndarray::Array2;
use std::path::PathBuf;

fn example() -> NpkResult<()> {
    let io = ParallelIO::new(PathBuf::from("data.npk"))?;

    // Save
    let data = Array2::<f32>::zeros((1000, 128)).into_dyn();
    io.save_arrays(&[("embeddings".to_string(), data, DataType::Float32)])?;

    // In-place append (no file rewrite, O(new_data) complexity)
    let extra = Array2::<f32>::ones((100, 128)).into_dyn();
    io.append_rows("embeddings", &extra)?;

    // Load full array (mmap with LRU cache, invalidated on write)
    let arr: ndarray::ArrayD<f32> = io.load_array("embeddings")?;
    assert_eq!(arr.shape(), &[1100, 128]);

    // Random access by index (mmap, contiguous block detection)
    let rows: ndarray::ArrayD<f32> = io.getitem("embeddings", &[0, 10, -1])?;
    assert_eq!(rows.shape(), &[3, 128]);

    // Replace rows in-place (pwrite, no file rewrite)
    let new_rows = Array2::<f32>::from_elem((2, 128), 42.0).into_dyn();
    io.replace_rows("embeddings", &new_rows, &[0, 1])?;

    // Logical delete + compact
    io.drop_arrays("embeddings", Some(&[5, 6, 7]))?;
    io.compact_array("embeddings")?;

    // Clone array
    io.clone_array("embeddings", "embeddings_backup")?;

    // Query
    let shape = io.get_shape("embeddings")?;
    let names = io.list_arrays();
    let mtime = io.get_modify_time("embeddings");

    // Delete entire array
    io.drop_arrays("embeddings_backup", None)?;

    io.sync_metadata()?;
    Ok(())
}

Streaming Load:

// Process large arrays in batches without loading everything into memory
let iter: StreamIterator<f32> = io.stream_load("large_data", 10000)?;
for batch_result in iter {
    let batch: ndarray::ArrayD<f32> = batch_result?;
    // Process batch (up to 10000 rows each)
    println!("Batch shape: {:?}", batch.shape());
}

Data Type Mapping:

NumPack Type Rust Type Size
DataType::Bool bool 1 byte
DataType::Int8 i8 1 byte
DataType::Int16 i16 2 bytes
DataType::Int32 i32 4 bytes
DataType::Int64 i64 8 bytes
DataType::Uint8 u8 1 byte
DataType::Uint16 u16 2 bytes
DataType::Uint32 u32 4 bytes
DataType::Uint64 u64 8 bytes
DataType::Float16 half::f16 2 bytes
DataType::Float32 f32 4 bytes
DataType::Float64 f64 8 bytes
DataType::Complex64 num_complex::Complex32 8 bytes
DataType::Complex128 num_complex::Complex64 16 bytes

Key Design Features

  • mmap-based Reading: All read operations (load_array, getitem, stream_load) use memmap2 with an automatic cache keyed by last_modified timestamp. Cache is invalidated on write/append/delete.
  • In-place Append: append_rows opens the data file in append mode and writes only the new data. No existing data is rewritten. Metadata is updated incrementally.
  • In-place Replace: replace_rows uses positional writes (pwrite) to update specific rows without touching unrelated data.
  • Logical Deletion: drop_arrays with indices uses a bitmap to mark rows as deleted. Read operations automatically skip deleted rows. Call compact_array to physically reclaim space.
  • Adaptive Parallelism: save_arrays automatically uses Rayon parallel processing when saving multiple arrays with total size > 10MB.
  • Adaptive Buffering: Write buffer sizes are tuned by data size (256KB / 4MB / 16MB for small / medium / large arrays).

Concurrent Access

Multiple threads can safely write to the same storage concurrently (since v0.5.1+):

use numpack::prelude::*;
use ndarray::Array2;
use std::path::PathBuf;
use std::thread;

fn concurrent_write() -> NpkResult<()> {
    let dir = "/tmp/numpack_data";
    std::fs::create_dir_all(dir)?;
    
    let handles: Vec<_> = (0..10)
        .map(|i| {
            let dir = dir.to_string();
            thread::spawn(move || {
                let io = ParallelIO::new(PathBuf::from(dir))?;
                let data = Array2::<f32>::ones((100, 128)).into_dyn();
                io.save_arrays(&[(format!("chunk_{}", i), data, DataType::Float32)])?;
                io.sync_metadata()?;
                Ok::<_, NpkError>(())
            })
        })
        .collect();
    
    for h in handles {
        h.join().unwrap()?;
    }
    
    Ok(())
}

Best Practices for Concurrent Access:

  • Each thread creates its own ParallelIO instance
  • Call sync_metadata() before dropping the instance
  • For read-heavy workloads, use separate read instances

Performance Tips

// 1. Batch saves for multiple arrays (auto-parallel for large data)
let arrays: Vec<(String, ndarray::ArrayD<f32>, DataType)> = vec![
    ("a".to_string(), data_a, DataType::Float32),
    ("b".to_string(), data_b, DataType::Float32),
];
io.save_arrays(&arrays)?;

// 2. Use append_rows for incremental data (fastest, no rewrite)
let new_data = Array2::<f32>::ones((100, 128)).into_dyn();
io.append_rows("a", &new_data)?;

// 3. Use replace_rows for updating existing rows (pwrite, no rewrite)
let updated = Array2::<f32>::zeros((3, 128)).into_dyn();
io.replace_rows("a", &updated, &[0, 1, 2])?;

// 4. Use stream_load for large arrays that don't fit in memory
let iter: StreamIterator<f32> = io.stream_load("a", 50000)?;
for batch in iter {
    let batch = batch?;
    // process batch...
}

// 5. Call sync_metadata() once after all operations
io.sync_metadata()?;

// 6. Use compact_array() periodically after many deletions
io.drop_arrays("a", Some(&[0, 1, 2]))?;
io.compact_array("a")?;

Error Handling

use numpack::core::error::{NpkError, NpkResult};

match io.get_array_metadata("nonexistent") {
    Ok(meta) => println!("Found: {:?}", meta.shape),
    Err(NpkError::ArrayNotFound(name)) => println!("Array {} not found", name),
    Err(e) => eprintln!("Error: {:?}", e),
}

Batch Modes

# Batch Mode - cached writes (21x speedup)
with npk.batch_mode():
    for i in range(1000):
        arr = npk.load('data')
        arr[:10] *= 2.0
        npk.save({'data': arr})

# Writable Batch Mode - direct mmap (108x speedup)
with npk.writable_batch_mode() as wb:
    arr = wb.load('data')
    arr[:10] *= 2.0  # Auto-persisted

Vector Engine

SIMD-accelerated similarity search (AVX2, AVX-512, NEON, SVE).

from numpack.vector_engine import VectorEngine, StreamingVectorEngine

# In-memory search
engine = VectorEngine()
indices, scores = engine.top_k_search(query, candidates, 'cosine', k=10)

# Multi-query batch (30-50% faster)
all_indices, all_scores = engine.multi_query_top_k(queries, candidates, 'cosine', k=10)

# Streaming from file (for large datasets)
streaming = StreamingVectorEngine()
indices, scores = streaming.streaming_top_k_from_file(
    query, 'vectors.npk', 'embeddings', 'cosine', k=10
)

Supported Metrics: cosine, dot, l2, l2sq, hamming, jaccard, kl, js

Format Conversion

Convert between NumPack and other formats (PyTorch, Arrow, Parquet, SafeTensors).

from numpack.io import from_tensor, to_tensor, from_table, to_table

# Memory <-> .npk (zero-copy when possible)
from_tensor(tensor, 'output.npk', array_name='embeddings')  # tensor -> .npk
tensor = to_tensor('input.npk', array_name='embeddings')     # .npk -> tensor

from_table(table, 'output.npk')  # PyArrow Table -> .npk
table = to_table('input.npk')     # .npk -> PyArrow Table

# File <-> File (streaming for large files)
from numpack.io import from_pt, to_pt
from_pt('model.pt', 'output.npk')  # .pt -> .npk
to_pt('input.npk', 'output.pt')    # .npk -> .pt

Supported formats: PyTorch (.pt), Feather, Parquet, SafeTensors, NumPy (.npy), HDF5, Zarr, CSV

Pack & Unpack

Portable .npkg format for easy migration and sharing.

from numpack import pack, unpack, get_package_info

# Pack NumPack directory into a single .npkg file
pack('data.npk')                          # -> data.npkg (with Zstd compression)
pack('data.npk', 'backup/data.npkg')      # Custom output path

# Unpack .npkg back to NumPack directory
unpack('data.npkg')                       # -> data.npk
unpack('data.npkg', 'restored/')          # Custom restore path

# View package info without extracting
info = get_package_info('data.npkg')
print(f"Files: {info['file_count']}, Compression: {info['compression_ratio']:.1%}")

Benchmarks

Tested on macOS Apple Silicon, 1M rows × 10 columns, Float32 (38.1MB)

Operation NumPack NPY Advantage
Full Load 4.00ms 6.56ms 1.64x
Lazy Load 0.002ms 0.102ms 51x
Replace 100 rows 0.040ms 13.74ms 344x
Append 100 rows 0.054ms 18.26ms 338x
Random Access (100) 0.004ms 0.002ms ~equal
Multi-Format Comparison

Core Operations (1M × 10, Float32, ~38.1MB):

Operation NumPack NPY Zarr HDF5 Parquet Arrow
Save 11.94ms 6.48ms 70.91ms 58.07ms 142.11ms 16.85ms
Full Load 4.00ms 6.56ms 32.86ms 53.99ms 16.49ms 12.39ms
Lazy Load 0.002ms 0.102ms 0.374ms 0.082ms N/A N/A
Replace 100 0.040ms 13.74ms 7.61ms 0.29ms 162.48ms 26.93ms
Append 100 0.054ms 18.26ms 9.05ms 0.39ms 173.45ms 42.46ms

Random Access Performance:

Batch Size NumPack NPY (mmap) Zarr HDF5 Parquet Arrow
100 rows 0.004ms 0.002ms 2.66ms 0.66ms 16.25ms 12.43ms
1K rows 0.025ms 0.021ms 2.86ms 5.02ms 16.48ms 12.61ms
10K rows 0.118ms 0.112ms 16.63ms 505.71ms 17.45ms 12.81ms

Batch Mode Performance (100 consecutive operations):

Mode Time Speedup
Normal 414ms -
Batch Mode 20.1ms 21x
Writable Batch 4.5ms 92x

File Size:

Format Size Compression
NumPack 38.15MB -
NPY 38.15MB -
NPZ 34.25MB
Zarr 34.13MB
HDF5 38.18MB -
Parquet 44.09MB
Arrow 38.16MB -

When to Use NumPack

Use Case Recommendation
Frequent modifications NumPack (344x faster)
ML/DL pipelines NumPack (zero-copy random access, no full load)
Vector similarity search NumPack (SIMD)
Write-once, read-many NumPack (1.64x faster read)
Extreme compression NumPack .npkg (better ratio, streaming, high I/O)
RAG/Embedding storage NumPack (fast retrieval + SIMD search)
Feature store NumPack (real-time updates + low latency)
Memory-constrained environments NumPack (mmap + lazy loading)
Multi-process data sharing NumPack (zero-copy mmap)
Incremental data pipelines NumPack (338x faster append)
Real-time feature updates NumPack (ms-level replace)

Documentation

See docs/ for detailed guides and unified_benchmark.py for benchmark code.

Contributing

Contributions welcome! Please submit a Pull Request.

License

Apache License 2.0 - see LICENSE for details.

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

numpack-0.7.0.tar.gz (365.6 kB view details)

Uploaded Source

Built Distributions

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

numpack-0.7.0-cp314-cp314-win_amd64.whl (784.5 kB view details)

Uploaded CPython 3.14Windows x86-64

numpack-0.7.0-cp314-cp314-macosx_11_0_arm64.whl (882.6 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

numpack-0.7.0-cp313-cp313-win_amd64.whl (788.5 kB view details)

Uploaded CPython 3.13Windows x86-64

numpack-0.7.0-cp313-cp313-manylinux_2_38_x86_64.whl (13.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.38+ x86-64

numpack-0.7.0-cp313-cp313-macosx_11_0_arm64.whl (885.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

numpack-0.7.0-cp312-cp312-win_amd64.whl (788.8 kB view details)

Uploaded CPython 3.12Windows x86-64

numpack-0.7.0-cp312-cp312-manylinux_2_38_x86_64.whl (13.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.38+ x86-64

numpack-0.7.0-cp312-cp312-macosx_11_0_arm64.whl (885.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

numpack-0.7.0-cp311-cp311-win_amd64.whl (789.4 kB view details)

Uploaded CPython 3.11Windows x86-64

numpack-0.7.0-cp311-cp311-manylinux_2_38_x86_64.whl (13.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.38+ x86-64

numpack-0.7.0-cp311-cp311-macosx_11_0_arm64.whl (886.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

numpack-0.7.0-cp310-cp310-win_amd64.whl (789.5 kB view details)

Uploaded CPython 3.10Windows x86-64

numpack-0.7.0-cp310-cp310-manylinux_2_38_x86_64.whl (13.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.38+ x86-64

numpack-0.7.0-cp310-cp310-macosx_11_0_arm64.whl (879.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

numpack-0.7.0-cp39-cp39-win_amd64.whl (789.2 kB view details)

Uploaded CPython 3.9Windows x86-64

numpack-0.7.0-cp39-cp39-manylinux_2_38_x86_64.whl (13.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.38+ x86-64

numpack-0.7.0-cp39-cp39-macosx_11_0_arm64.whl (886.9 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file numpack-0.7.0.tar.gz.

File metadata

  • Download URL: numpack-0.7.0.tar.gz
  • Upload date:
  • Size: 365.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for numpack-0.7.0.tar.gz
Algorithm Hash digest
SHA256 6e2be773d37ae209f82dc2997daaf5b1d00d9a9940b7a915d464dcd99b41d6eb
MD5 4643bb1f51b7221770dc9f706fe79d18
BLAKE2b-256 2e526f614ccc79a62b028bdbd5fcf81bcf3ccf5f4456b08c65af10f9d57bd57a

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: numpack-0.7.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 784.5 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for numpack-0.7.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 0bf4506c3f577fa32251755923d113d7cc6937546ed20097ce7707b8e71c58c6
MD5 67bc9cf6c284e55a1a503ecc0972a843
BLAKE2b-256 8f2c4c50cab27fe07708b7ae5173f248857b300e144e3c41becc1649e7d8e98a

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a701e64f148dbda31bac901533d1ca905365ee133ea76c492b88ce2d0764f65c
MD5 b6a600752da34e0635622e99e76e2e7d
BLAKE2b-256 d1c71a5b05809c8ea7b4804fad34d46caa69ea3584f1aebd4c75d5c67f7e2674

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: numpack-0.7.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 788.5 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for numpack-0.7.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ecc23a2a87ea83660ffe6e742c5917261183c4cffdc1c533e8fd4473ea223a44
MD5 329532aa96d235674f5de186a809c534
BLAKE2b-256 20570cfb2095856b22e1ed0cde7d73b2a91a674d7ea88c14608f235875c207ca

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp313-cp313-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp313-cp313-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 ba40ed54cff0add563f4dd03ac720fd6fba9f797110b6cf014130320ed840f6a
MD5 91344639cd804244dad78a40184e8590
BLAKE2b-256 22f32cb09924d1a24277d82f67a97197b12169f40c8ceb22761fbc97763e661b

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e0854d7ef4e0af03a5b9ddc92be7c454ea1808e1374ad6a6cad5cb059692a38e
MD5 9d6f71901dcf1727b42e197970b0c634
BLAKE2b-256 a61045f3c81c600a3ab17737b7da5f739683c57e1ec0af75197a458ba030048c

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: numpack-0.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 788.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for numpack-0.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2c66a03e627c08095a7e7705a8a56893b9cd9a935f20e39463c5bcd3afbdd396
MD5 bb6840c409d1eea8b82b2029943d88b3
BLAKE2b-256 cfa809194a88492c271dd699e574feda5615f4abc8951211fca6476431f3fbd8

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp312-cp312-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp312-cp312-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 486d323d761421e660fc5fa283557c40c291d9f828ba88473a9e11a48928d2ba
MD5 ae313720b22afd2bb12d152986a02db0
BLAKE2b-256 4e1d41be1aa3392006bfde7fc298e135ceeb02e9bd24640a0c4e9e5f04054f98

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4af8b7ca5a01af7751e05f605ab1dfecab783fb788729200055466109ffacdb
MD5 201a5fe28aca34addc69e3528d1d718d
BLAKE2b-256 52b7885a3dc78898bb51b2520ffcb8787c97c814995e684403dba3835bc47171

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: numpack-0.7.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 789.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for numpack-0.7.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3b641ba51628267d08d62afff282594d6ec2669a33e76964504839fa54324eff
MD5 3872a6d759fb02a9b46926490c47a82f
BLAKE2b-256 d775b098f84c317a58c1de87a4b8c3a99d1fb90023349e60953eeb28f110f1a5

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp311-cp311-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp311-cp311-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 8a463871f4592c53e6b324c7bc7b443b804c0d63433c7bb7a76b2981d3831668
MD5 fac3bc234d499966e4c2ddf35db9180e
BLAKE2b-256 7eb011d6dc87238a9a6686b3c977cb1f7d9f7f921bb3448c691ff94b275893a1

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f18e006275c7dcb59e1d4fdb3ad8061d5f0b270be4a4a4aac37217aecdceea7b
MD5 3d717f411b698f33e42218bf70cb4362
BLAKE2b-256 bc578259ebbf4f148f41e97499fccca7744f89b4aba2811daa63ca747a9e8dfe

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: numpack-0.7.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 789.5 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for numpack-0.7.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8fca764d55e0d99bccb90ef2a75db54aa05c44d323869eb46e5574c5256f4ec9
MD5 12479b17d9f3536d68ee2c0f810a3328
BLAKE2b-256 16290d0901719ffd075f170c0e50bb90263800767be839c2641002c879b41636

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp310-cp310-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp310-cp310-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 c43db5b9cab17e8d3a7052df28b45e601252df05a2ac839389f3ef1c8e53fb3d
MD5 607ed05f0811e788a191ce4020fc69bc
BLAKE2b-256 8f1653cd4c489eb9acd6e08676ec2c02cf95be682d4d96f3d27a3ae6faae540a

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fe9d149388312702fab03ac92683fdcb630f7a1f316bdc80c51804221b4d9424
MD5 1a42b0105bb439cb46a04d95d55103e4
BLAKE2b-256 74195f83a209f21de9d781cbcfdf06fed05632f4eb350addd19a388656f6112f

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: numpack-0.7.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 789.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for numpack-0.7.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f7deab42c29f6932e52c84e698cc6a8143f32b6cfd005fbcc8328fd014cc138e
MD5 ba4b89b202f5b229a1fa9069283c05ea
BLAKE2b-256 9274e6bddae72b4a4fcb86f148c59690734f52e00f3dc1a286fa86d214c52920

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp39-cp39-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp39-cp39-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 a4348743c31d6670f13b5cefada12642ec5e12f2079faf51563b2168a92d1759
MD5 69ef20db1c070ff8dfa5e29735fca580
BLAKE2b-256 d23e5769a6de910bf19c9838b2adffa52dd37daf8e366c5cd3be0128611951c8

See more details on using hashes here.

File details

Details for the file numpack-0.7.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numpack-0.7.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0005ab7699c620a85806810fa12568e65070b86e7094653b663ce89e54ea2034
MD5 0330d1abc35cfd18253662ca9574b478
BLAKE2b-256 95b4560d82e92b099402316b72e79c1f9c356e1ae0b252c292738770604ef45f

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