Skip to main content

InterpN

Writeup | Repo | Python Docs | Rust Docs

N-dimensional interpolation/extrapolation methods, no-std and no-alloc compatible, prioritizing correctness, performance, and compatibility with memory-constrained environments.

Available as a rust crate and python library.

Features

Feature →
↓ Interpolant Method
Regular
Grid
Rectilinear
Grid
Json
Serialization
Thread Parallelism
Nearest-Neighbor ✅ ✅ ✅ ✅
Linear ✅ ✅ ✅ ✅
Cubic Hermite ✅ ✅ ✅ ✅
Cubic B-spline ✅ ✅ ✅ ✅

The methods provided here, while more limited in scope than scipy's,

  • are significantly faster under most conditions
  • use almost no RAM (and perform no heap allocations at all)
  • produce significantly improved floating-point error (by several orders of magnitude)
  • are json-serializable using Pydantic
  • can also be used easily in web and embedded applications via the Rust library
  • are permissively licensed

For larger jobs such as image processing, the non-allocating evaluation pattern results in a nearly-linear thread speedup, limited only by thread spawning overhead and memory bandwidth.

See here for more info about quality-of-fit, throughput, and memory usage.

Installation

pip install interpn

Profile-Guided Optimization

To build the extension with profile-guided optimization, do sh ./scripts/distr_pgo.sh after installing this extra compiler dependency:

rustup component add llvm-tools-preview

An LLVM install matching the version used by rustc is also required for doing PGO; see the ./scripts/distr_pgo.sh or CI workflows for the exact version.

Rust Examples

Regular Grid

use interpn::{multilinear, multicubic};

// Define a grid
let x = [1.0_f64, 2.0, 3.0, 4.0];
let y = [0.0_f64, 1.0, 2.0, 3.0];

// Grid input for rectilinear method
let grids = &[&x[..], &y[..]];

// Grid input for regular grid method
let dims = [x.len(), y.len()];
let starts = [x[0], y[0]];
let steps = [x[1] - x[0], y[1] - y[0]];

// Values at grid points
let z = [2.0; 16];

// Observation points to interpolate/extrapolate
let xobs = [0.0_f64, 5.0];
let yobs = [-1.0, 3.0];
let obs = [&xobs[..], &yobs[..]];

// Storage for output
let mut out = [0.0; 2];

// Do interpolation
multilinear::regular::interpn(&dims, &starts, &steps, &z, &obs, &mut out);
multicubic::regular::interpn(&dims, &starts, &steps, &z, false, &obs, &mut out);

Rectilinear Grid

use interpn::{multilinear, multicubic};

// Define a grid
let x = [1.0_f64, 2.0, 3.0, 4.0];
let y = [0.0_f64, 1.0, 2.0, 3.0];

// Grid input for rectilinear method
let grids = &[&x[..], &y[..]];

// Values at grid points
let z = [2.0; 16];

// Points to interpolate/extrapolate
let xobs = [0.0_f64, 5.0];
let yobs = [-1.0, 3.0];
let obs = [&xobs[..], &yobs[..]];

// Storage for output
let mut out = [0.0; 2];

// Do interpolation
multilinear::rectilinear::interpn(grids, &z, &obs, &mut out).unwrap();
multicubic::rectilinear::interpn(grids, &z, false, &obs, &mut out).unwrap();

Python Examples

Available Methods

import interpn
import numpy as np

# Build grid
x = np.linspace(0.0, 10.0, 5)
y = np.linspace(20.0, 30.0, 4)
grids = [x, y]

xgrid, ygrid = np.meshgrid(x, y, indexing="ij")
zgrid = (xgrid + 2.0 * ygrid)  # Values at grid points

# Grid inputs for true regular grid
dims = [x.size, y.size]
starts = np.array([x[0], y[0]])
steps = np.array([x[1] - x[0], y[1] - y[0]])

# Initialize different interpolators
# Call like `linear_regular.eval([xs, ys])`
linear_regular = interpn.MultilinearRegular.new(dims, starts, steps, zgrid)
cubic_regular = interpn.MulticubicRegular.new(dims, starts, steps, zgrid)
linear_rectilinear = interpn.MultilinearRectilinear.new(grids, zgrid)
cubic_rectilinear = interpn.MulticubicRectilinear.new(grids, zgrid)

Multilinear Interpolation

import interpn
import numpy as np

# Build grid
x = np.linspace(0.0, 10.0, 5)
y = np.linspace(20.0, 30.0, 4)

xgrid, ygrid = np.meshgrid(x, y, indexing="ij")
zgrid = (xgrid + 2.0 * ygrid)  # Values at grid points

# Grid inputs for true regular grid
dims = [x.size, y.size]
starts = np.array([x[0], y[0]])
steps = np.array([x[1] - x[0], y[1] - y[0]])

# Observation points pointed back at the grid
obs = [xgrid.flatten(), ygrid.flatten()]

# Initialize
interpolator = interpn.MultilinearRegular.new(dims, starts, steps, zgrid.flatten())

# Interpolate
out = interpolator.eval(obs)

# Check result
assert np.allclose(out, zgrid.flatten(), rtol=1e-13)

# Serialize and deserialize
roundtrip_interpolator = interpn.MultilinearRegular.model_validate_json(
    interpolator.model_dump_json()
)
out2 = roundtrip_interpolator.eval(obs)

# Check result from roundtrip serialized/deserialized interpolator
assert np.all(out == out2)

License

Licensed under either of

at your option.

Release files for interpn 0.11.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for interpn 0.11.2
File Size Uploaded
interpn-0.11.2.tar.gz 2.0 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for interpn 0.11.2
File
interpn-0.11.2-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
interpn-0.11.2-cp310-abi3-win32.whl CPython 3.10 abi3 Windows x86-32 Details
interpn-0.11.2-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
interpn-0.11.2-cp310-abi3-musllinux_1_2_i686.whl CPython 3.10 abi3 Linux musl 1.2+ x86-32 Details
interpn-0.11.2-cp310-abi3-musllinux_1_2_armv7l.whl CPython 3.10 abi3 Linux musl 1.2+ ARMv7l Details
interpn-0.11.2-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
interpn-0.11.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
interpn-0.11.2-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl CPython 3.10 abi3 Linux glibc 2.17+ IBM System/390x Details
interpn-0.11.2-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl CPython 3.10 abi3 Linux glibc 2.17+ PowerPC 64-le Details
interpn-0.11.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.10 abi3 Linux glibc 2.17+ ARMv7l Details
interpn-0.11.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
interpn-0.11.2-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
interpn-0.11.2-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 18.4 MB

Release files / interpn-0.11.2.tar.gz

Download URL interpn-0.11.2.tar.gz
Size 2.0 MB
Tags Source
SHA-256 checksum
How to use checksums
e69afe45f674e35c33f535fd63b42dbb74a46bb4ef9bd39e9d86be74ead414ea
BLAKE2b-256 checksum
How to use checksums
6d513f2f80f1dd80d43f0aa83ea00b8c747e5d9a076189c8111aa50d16772591
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-win_amd64.whl

Download URL interpn-0.11.2-cp310-abi3-win_amd64.whl
Size 1.3 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
81864516d4163876c692f344a6f30474af6f3e1aa3c9d1b9c28dc402b6087b0c
BLAKE2b-256 checksum
How to use checksums
386706a86d38ddff0d2f477f22259ad331f2ac92a9d66056af01e7305bc77dcf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-win32.whl

Download URL interpn-0.11.2-cp310-abi3-win32.whl
Size 1.1 MB
Tags CPython 3.10 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
a854b51008b30450a37c720beaf13163beeaf06266a9b37994034e1d63a7143a
BLAKE2b-256 checksum
How to use checksums
6f83fcf4da0c9967e04d419dd19ceb2a6788eef2e83b3144e7cb58391df276b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL interpn-0.11.2-cp310-abi3-musllinux_1_2_x86_64.whl
Size 1.3 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
e52d28ba877f0d655bb65fcd1842edfc148f8e1ff4e13bab4474b12fdb51589e
BLAKE2b-256 checksum
How to use checksums
126bda47f11ca0fcaeb2689b300df79068dfe59eb96035c7756572098b0e57bc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-musllinux_1_2_i686.whl

Download URL interpn-0.11.2-cp310-abi3-musllinux_1_2_i686.whl
Size 1.5 MB
Tags CPython 3.10 Linux musl 1.2+ x86-32 abi3
SHA-256 checksum
How to use checksums
1899e651d8b3f2e868054573e133cdde0c26dada6c897af2b00da455a4e075cd
BLAKE2b-256 checksum
How to use checksums
7aa24339c75a68f2979bfcfaf1c30d5389a221c2250999c86cf49d8263a692c4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-musllinux_1_2_armv7l.whl

Download URL interpn-0.11.2-cp310-abi3-musllinux_1_2_armv7l.whl
Size 1.4 MB
Tags CPython 3.10 Linux musl 1.2+ ARMv7l abi3
SHA-256 checksum
How to use checksums
d4cf1a37c9372ebddc79ad8690edd9e63a07ecea6b9406c358b51ece65084784
BLAKE2b-256 checksum
How to use checksums
0e7f6238328ff719ca9781ccba793fb168b4d9117bb40e37177aa0208d066996
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL interpn-0.11.2-cp310-abi3-musllinux_1_2_aarch64.whl
Size 1.2 MB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
8cc1a67d088a732e69586af048fc82ea99576025a6474034189e7b320e7d4241
BLAKE2b-256 checksum
How to use checksums
9c9e4aa8fd5d1a8e3271cfb14daa242c306dfa52282e45c6b1ff220cdc7349bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL interpn-0.11.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.3 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
5210d31dcb9b868fa030239a2ec1e66c58b622860f01b62889176629d8582d2f
BLAKE2b-256 checksum
How to use checksums
0befeb44039eaf064418c23a979c67978089765a4e824cfb43a4897075e7c235
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl

Download URL interpn-0.11.2-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
Size 1.3 MB
Tags CPython 3.10 Linux glibc 2.17+ IBM System/390x abi3
SHA-256 checksum
How to use checksums
06a175b0680bbcec4b9e606a2354c4a4ee1c2117a05a8a71667d0af5416dcbe3
BLAKE2b-256 checksum
How to use checksums
4bbc7bb88f09fdd2220855f4282d331feb59a7638ea99f7b82a4d715316f454c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl

Download URL interpn-0.11.2-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Size 1.2 MB
Tags CPython 3.10 Linux glibc 2.17+ PowerPC 64-le abi3
SHA-256 checksum
How to use checksums
0e40d7f2bfc184670f1b93733a719d6e1ba01f000427edc0614f0ca649bc5671
BLAKE2b-256 checksum
How to use checksums
65d2df7fe7606fdc85cd1613ee6ebab379b55873483075a4812acde1fdb36aa3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL interpn-0.11.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 1.1 MB
Tags CPython 3.10 Linux glibc 2.17+ ARMv7l abi3
SHA-256 checksum
How to use checksums
04787a1032d2dc4f2c5a351b2f32529203013cd1db0f2f39ff5439496ac02c8f
BLAKE2b-256 checksum
How to use checksums
d8142cdd820501155061d6b68694a078d18bb110212d34b6ea92c9f49972dbf7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL interpn-0.11.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 1.2 MB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
9568fe99e852012bde1af25cba33b59af16d37707bf849183a268899212663dc
BLAKE2b-256 checksum
How to use checksums
d211e30227ac05c0282b19ec9e9f41b679f853801a5b63113c59074305aec5e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-macosx_11_0_arm64.whl

Download URL interpn-0.11.2-cp310-abi3-macosx_11_0_arm64.whl
Size 1.2 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
33bc41740752f6d41916198c92c37325a1fc52342e391d951dec13074164f7f1
BLAKE2b-256 checksum
How to use checksums
71f877031c48be55be7faf3ed7f07748c7123c5a0e63530011359c93db086145
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1

Release files / interpn-0.11.2-cp310-abi3-macosx_10_12_x86_64.whl

Download URL interpn-0.11.2-cp310-abi3-macosx_10_12_x86_64.whl
Size 1.3 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
fbc883b911140570f63763d449c801ca250b188e82cd74f99c435de6481e9289
BLAKE2b-256 checksum
How to use checksums
83949b710054559c1c7e96007960929923396622b91ffcc36e68978a44156087
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.14.1
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page