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.6.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.6.0-cp314-cp314-win_amd64.whl (749.2 kB view details)

Uploaded CPython 3.14Windows x86-64

numpack-0.6.0-cp314-cp314-macosx_11_0_arm64.whl (834.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

numpack-0.6.0-cp313-cp313-win_amd64.whl (752.3 kB view details)

Uploaded CPython 3.13Windows x86-64

numpack-0.6.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.6.0-cp313-cp313-macosx_11_0_arm64.whl (835.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

numpack-0.6.0-cp312-cp312-win_amd64.whl (752.9 kB view details)

Uploaded CPython 3.12Windows x86-64

numpack-0.6.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.6.0-cp312-cp312-macosx_11_0_arm64.whl (836.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

numpack-0.6.0-cp311-cp311-win_amd64.whl (752.3 kB view details)

Uploaded CPython 3.11Windows x86-64

numpack-0.6.0-cp311-cp311-manylinux_2_38_x86_64.whl (13.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.38+ x86-64

numpack-0.6.0-cp311-cp311-macosx_11_0_arm64.whl (836.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

numpack-0.6.0-cp310-cp310-win_amd64.whl (752.3 kB view details)

Uploaded CPython 3.10Windows x86-64

numpack-0.6.0-cp310-cp310-manylinux_2_38_x86_64.whl (13.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.38+ x86-64

numpack-0.6.0-cp310-cp310-macosx_11_0_arm64.whl (837.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

numpack-0.6.0-cp39-cp39-win_amd64.whl (752.3 kB view details)

Uploaded CPython 3.9Windows x86-64

numpack-0.6.0-cp39-cp39-manylinux_2_38_x86_64.whl (13.3 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.38+ x86-64

numpack-0.6.0-cp39-cp39-macosx_11_0_arm64.whl (837.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: numpack-0.6.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.12

File hashes

Hashes for numpack-0.6.0.tar.gz
Algorithm Hash digest
SHA256 2de83ac3b1b48f9485163060063f063f6dc7237b73faa5c460cfbb20299f317f
MD5 12f1c7d029db422f9369e6013811b219
BLAKE2b-256 a9d5a50ae3000e7b849a427887f383d4a3cccb0f5a51daede59219cbc8b86b9a

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for numpack-0.6.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 af698bc242872257022dc3ae3f45be2c945b3b3b31b4f7c79236dcc53994edb0
MD5 a1bef7a8c2b72ad9ff3d52dd9a113b67
BLAKE2b-256 7d234ccf1d525eb45042b967ecc11e290854bf31eb8da73804af7f7bb1b760c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 68243d8ee4ed28ea290c17a19bda2e36400e2c116f79dfd65def8ffc04f94421
MD5 01da07a5962c57f7d2c54dc0db648686
BLAKE2b-256 67c7d226ba3672c38ed59d39d8fed46186603f3fff4c5dc547b3637f4510bef9

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for numpack-0.6.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f5b23cb54e75c3ce4cee4da0b28cb80db1515094c864907443bcd7962d5883e0
MD5 0a2636bdae083f229f1c40d10e96de99
BLAKE2b-256 754389717fec7d0a85bee5bc5dce28f31d2f37724d838a4dec35a766474e2696

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp313-cp313-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 3cef75cafdf658ddbbd79bd5ac6b7aa815a3da82e28873a59e0e541c9f8e02da
MD5 0059433fccb1e37a0183985c63ebbf27
BLAKE2b-256 da78401c7478587eedcfbb320e04f48d58af29a2a242a239b7524ae6681a88e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8d60a4dfc6689212b68ff17cf8201093cfe652f973a424f12bee96556b496d38
MD5 46ad260c819554c878c6c48004f35c45
BLAKE2b-256 50c36db38120b19db94588ba7d6e64d8a581d844f8a7841ae45e9bfe581a958d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for numpack-0.6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 29bdc43e983a26510b36a3b4ce8610e6d0de4b6355f46bdb95d5c459236a1099
MD5 9a69926441d1fc9a69d63d86ba549cbb
BLAKE2b-256 a5e5b259ea3f00aef211cdd581a983b6cf171f6ead5cb423e66660758752d74d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp312-cp312-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 a1bbe69b1ab08d8f21947f6ac5c931cf4106802acc5a9c54f39e7a248cb7d145
MD5 4a997904ebdf6510fe5f7ca9684be821
BLAKE2b-256 0dcfd6531a14e4d57d74d52623869480ebdbd617ba55b63b595564052b9c9d49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cb4a7a75ff3e7bf6065a04ef470614e0d61efdc69895935307a51c1f7046436f
MD5 fa41735e3d4d480de5178ca084520e4f
BLAKE2b-256 5d60d3bee10b351c01e1ee9adc619039c6bf23d28d454248ac552d705d1b1fab

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for numpack-0.6.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2259c4482b4db75239e178d6c2883cef564f839fcc452ac29cdf5c3c40f1613e
MD5 14bbc12b9e25564f080492a0a3b5a5f1
BLAKE2b-256 f8316b95bb7d591ae0a1cb81ec9a6fc827887e57853e40d76948e46583230045

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp311-cp311-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 89837a6195c758339ab36449b2cb54b73e52b888e31d58f33e1632f70e8083c2
MD5 4be2fcdd46130d91380c60ddebcce350
BLAKE2b-256 6e74adf2e42c0a8df5d9aa58d0e2fbfbb8900e944ef7c5e6a2af3dc2de7c49c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ec313999953a51fd50bd7af9c491fd120bafef47aa4bde4f62bf4e74e234083
MD5 1cde5a8da6fb688fdf880dca315f5378
BLAKE2b-256 087b4604a13e63b6799d8b0f4903e690566b419f86eb6735fa1780298072b54d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for numpack-0.6.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 99ffc142808cc3494520b707a5bc7aa67681f1435fe6d11b8fd5a86d05ac246f
MD5 548be15f769cf479f1d9d0df15ff07d2
BLAKE2b-256 6024806164d6e2275f5cfd5edbfdefab987b56f6e1cdae0655036d39c8549738

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp310-cp310-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 9928aa17658c1dd1b78d2ac020d0e0f583551121b3730b3f589eb03f10927862
MD5 2c1588a66db13b568c0cd6b8eebde221
BLAKE2b-256 b803884b29f70d2756307156c732bebec9211388ec051e538af0e73f37a8f1a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 915b6d3eef98d685713ddfe46b81166b417dbc30a4b81024f81155dbb16ec99e
MD5 9917a1c9d6e875857e701b600aaa7a79
BLAKE2b-256 892f035648fd5b8862c4d43f540cdf715e2962971b530296fd5bdbfa56d2844c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for numpack-0.6.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5f772692f92ba5cd4e221a2aa5193bcc03e30dd22e41eb4bd8789c1d6518ec68
MD5 4c7b6306f6abcf04fa36098243dfde59
BLAKE2b-256 069fb88f9ca4f91ea12d7cc284977f2327c8f0239abd11a12e7468bfa8a53c6b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp39-cp39-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 c18118b16030e0dc4fc124dc3ef3072c091e25b8b24576d99e25bfb808648d6e
MD5 78cae98571d43de317bf58ea009af338
BLAKE2b-256 ad1c407d970e94fd75643e4c23cc23c35f61aaf58af8a62a21b10d7fa3834990

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for numpack-0.6.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7721e5a67a8bf568a46b8a3626ce11900c8ade307d3ce2d30fa3b31920e3a01d
MD5 40d37b2574c06995c13c5c75262c2afa
BLAKE2b-256 a64afd34159e8bcb77d376f9f51c5f85ccbdf38706d0489d3706cd84b707b774

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