Skip to main content

GitHub commit activity GitHub last commit GitHub Issues or Pull Requests GitHub Pull Requests GitHub Actions Workflow Status Documentation Dependabot Dependabot PRs

Ndpolator

Fast, n-dimensional linear interpolation and extrapolation on sparse grids.

Ndpolator is a combined interpolator/extrapolator that operates on sparse (incompletely populated) $n$-dimensional grids. It estimates scalar or vector function values within and beyond the definition range of the grid while still avoiding the need to impute missing data or sacrifice the benefits of structured grids. Ndpolator is written in C for speed and portability; a python wrapper that uses numpy arrays is provided for convenience.

Recent changes

ndpolator 1.3.1

  • replaces all C99 code with the ANSI standard so that Microsoft C compiler can build the code.

  • fixes compiler flag inconsistency across different platform compilers.

  • fixes pip self-upgrade on Windows.

  • sets the minimal setuptools version to 77 to ensure support for license reference.

ndpolator 1.3.0

  • implements kd-tree lookup of nearest vertices and/or hypercubes. The search speed for kd-trees is O(logN), where N is the number of vertices; compared to the previous linear search that has O(N) dependence, this provides a significant speed increase in extrapolation. For example, for a 3D 50x50x50 grid, the speed-up is ~500.

  • adds NDP_METHOD_LINEAR and NDP_METHOD_KDTREE options to ndpolator() and ndp_find_nearest() methods.

ndpolator 1.2.3

  • extrapolating with extrapolation_mode='nearest' when two or more points were at the exact same distance (within machine precision) did not consistently select the same point on all architectures, causing potential inconsistencies across different machines.

ndpolator 1.2.2

  • docbuild moved from PR actions to release action.

  • an incorrect argument name in unit tests fixed.

ndpolator 1.2.1

  • the computation of distance between the query point and the grid was not done correctly in off-grid vertices; fixed.

  • the find_nearest() function now stores an array of nearest points sorted by distance.

ndpolator 1.2

  • distance between the query point and the grid for off-grid query points is now explicitly computed and returned.

  • github workflows substantially improved.

ndpolator 1.1

  • memory management improvements.

ndpolator 1.0

  • initial release.

Installation

Ndpolator sources are hosted on pypi; you can install the latest release by issuing:

pip install ndpolator

To install ndpolator from github, clone the repo and install it from the local directory with pip:

$> git clone https://github.com/aprsa/ndpolator ndpolator
$> cd ndpolator
$> pip install .

Once installed, you can test the installation by running a pytest:

$> cd tests
$> pytest

Documentation

API reference is available on gh-pages.

Usage example

To demonstrate the usage of ndpolator, let us consider a 3-dimensional space with three axes of vastly different vertex magnitudes. For comparison purposes, let the function that we want to interpolate and extrapolate be a linear scalar field:

\mathbf a_1 = \{1000, 2000, 3000, 4000, 5000\}, \quad \mathbf a_2 = \{1, 2, 3, 4, 5\}, \quad \mathbf a_3 = \{0.01, 0.02, 0.03, 0.04, 0.05\},
\mathbf F(x, y, z) = \frac{x}{1000} + y + 100 z.

A suitable ndpolator instance would be initiated and operated as follows:

import numpy as np
import ndpolator

# initialize the axes:
a1 = np.linspace(1, 5, 5)
a2 = np.linspace(10, 50, 5)
a3 = np.linspace(100, 500, 5)

# initialize interpolation space:
ndp = ndpolator.Ndpolator(basic_axes=(a1, a2, a3))

# define a scalar function field and evaluate it across the grid:
def fv(pt):
    return pt[0] + pt[1] + pt[2]

grid = np.empty((len(a1), len(a2), len(a3), 1))
for i, x in enumerate(a1):
    for j, y in enumerate(a2):
        for k, z in enumerate(a3):
            grid[i, j, k, 0] = fv((x, y, z))

# label the grid ('main') and register it with the ndpolator instance:
ndp.register(table='main', associated_axes=None, grid=grid)

# draw query points randomly within and beyond the definition ranges:
query_pts = np.ascontiguousarray(
    np.vstack((
        np.random.uniform(-5, 5, 10),
        np.random.uniform(-50, 50, 10),
        np.random.uniform(-500, 500, 10))
    ).T
)

# interpolate and extrapolate linearly:
interps = ndp.ndpolate(table='main', query_pts=query_pts, extrapolation_method='nearest')

print(f'a1 = {a1}')
print(f'a2 = {a2}')
print(f'a3 = {a3}')
print(f'query_pts = {query_pts}')
print(f'interps = {interps}')

Purpose

Multi-variate ($n$-dimensional) interpolation and extrapolation are techniques used in mathematics, statistics and science to estimate unknown values between and beyond existing data points in a multi-dimensional space. Interpolation involves estimating the function value at points within the range determined by the existing data points, while extrapolation involves estimating the function value beyond that range. There are numerous robust implementations of multi-variate interpolation, including k nearest neighbors (Cover & Hart 1967), natural neighbor interpolation (Sibson 1981), radial basis functions (Hardy 1971), kriging (Cressie 1990), and many others. Scipy, for example, features an entire module for interpolation (scipy.interpolate) that implements several multi-variate interpolation classes, including piecewise-linear, nearest neighbor, and radial basis function interpolators. Unfortunately, none of the implemented scipy methods lend themselves readily to extrapolation: at most they can fill the values off the convex hull with nans or a value supplied by the user. In addition, interpolators that operate on a regular $n$-dimensional grid do not allow any missing data; those values either need to be imputed by using unstructured data interpolators, or structured data interpolators need to be abandoned altogether.

Ndpolator aims to fill this gap: it can both interpolate and extrapolate function values within and beyond the grid definition range, and it can operate on incomplete grids. As a side benefit, ndpolator can estimate both scalar and vector function values, and it can reduce grid dimensionality for points of interest that lie on grid axes. It is optimized for speed and portability (the backend is written in C), and it also features a python wrapper. Ndpolator was initially developed for the purposes of the eclipsing binary star modeling code PHOEBE (Prša et al. 2016), to allow the interpolation and extrapolation of specific intensities in stellar atmospheres. Yet given the gap in the multi-variate interpolation and extrapolation landscape, ndpolator development has been separated from PHOEBE and made available to the community as a standalone package.

Ndpolator's operation principles

Consider a scalar or a vector field $\mathbf{F}$ that is sampled in a set of $N$ $n$-dimensional points, $\{\mathbf F (x_1, \dots, x_n)_k\}$, $k = 1 \dots N$. Let these function values be sampled on a grid, where axes $\mathbf{a}_k$ span each grid dimension, so that $\mathsf{X}_{k=1}^{n} \mathbf a_k \equiv \mathbf{a}_1 \times \mathbf{a}_2 \times \dots \times \mathbf{a}_n$ is a cartesian product that spans the grid. Axis spacing need not be uniform: vertices can be separated by any amount that is required to make the grid sufficiently locally linear. If the grid is complete, i.e. if there is a function value $\mathbf F(x_1, \dots, x_n)$ associated with each grid point, we have $N_c = \prod_k l(\mathbf a_k)$ function value samples, where $l(\mathbf a)$ is the length of axis $\mathbf a$. If the grid is incomplete, i.e. if some function values are missing, then $N < N_c$. Ndpolator defines grid points with sampled values as nodes, and grid points with missing values as voids. The points in which we want to estimate the function value are called query points or points of interest. The smallest $n$-dimensional subgrid that encloses (or is adjacent to) the query point is called a hypercube.

Unit hypercube transformation

The first, most fundamental principle of ndpolator is that all interpolation and extrapolation is done on unit hypercubes. In real-world applications, it is seldomly true that all axes are defined on a unit interval. This can lead to vertices of significantly different orders of magnitude along individual axes. To that end, ndpolator first normalizes the hypercubes by transforming them to unit hypercubes: given the sets of two consecutive axis values that span a hypercube, $(\mathbf a_{1,p}, \mathbf a_{1,p+1}) \times (\mathbf a_{2,q}, \mathbf a_{2,q+1}) \times \dots \times (\mathbf a_{n,t}, \mathbf a_{n,t+1})$, the unit transformation maps it to the $[0, 1] \times [0, 1] \times \dots \times [0, 1] \equiv [0, 1]^n$ hypercube. All query points are subjected to the same transformation, creating unit-normalized query points. Therefore, interpolation (and extrapolation) always operates on unit hypercubes, which is computationally the least expensive and numerically the most stable process. An additional benefit of this transformation is that extrapolation inherits the nearest hypercube's grid spacing, thus naturally accounting for (potentially) variable spacing in different regions of the grid.

Sequential dimensionality reduction

The second operating principle of ndpolator is sequential dimensionality reduction. Consider a 3-dimensional hypercube in \autoref{fig:interpolation}; let us assume that function values in all 8 corners of the hypercube are sampled, i.e. we have 8 nodes. The point of interest is depicted with an open symbol in the left panel, along with projections onto the hypercube faces. Ndpolator starts with the last axis, in this case $\mathbf a_3$, and it interpolates function values along that axis to the projections of the point of interest (second panel). These are univariate interpolations. The process yields 4 vertices (depicted in open symbols), thereby reducing the initial dimension $N=3$ by 1, to $N-1=2$. The process is then repeated (third panel), this time along the second axis, $\mathbf a_2$, yielding 2 vertices, thereby reducing the dimension to 1. Finally, the last interpolation is done along axis $\mathbf a_1$ (right panel), yielding a single vertex, the point of interest itself. The dimension is thus reduced to 0, and the function value is determined. Thus, for an $n$-dimensional hypercube, ndpolator performs $\sum_{k=0}^{n-1} 2^k$ univariate interpolations to estimate $\mathbf F$ in the point of interest, which implies the $N \log N$ time dependence.

An example of sequential dimensionality reduction in 3 dimensions.\label{fig:interpolation}

Initial dimensionality reduction

The third operating principle of ndpolator is initial dimensionality reduction. In real-life applications it frequently happens that some of query point coordinates are aligned with the axes. For example, one of the axes might allow the variation of the second order variable, but its value usually defaults to the value that is sampled across the grid. When this happens, the initial hypercube dimension can be reduced by 1 for each aligned axis. The extreme case where the query point coincides with a node means that hypercube dimensionality is reduced to 0, and there is no need for interpolation. For that reason, ndpolator flags each coordinate of the query point as "on-grid", "on-vertex", or "out-of-bounds". When "on-vertex," hypercube dimension can be immediately reduced. When that happens, the time dependence is reduced to $(N-M) \log (N-M)$, where $M$ is the number of coordinates aligned with the axes.

Incomplete hypercubes

The fourth operating principle of ndpolator is dealing with incomplete hypercubes. If any of the hypercube corners are voids, we cannot interpolate. For that purpose, ndpolator keeps track of all fully defined $n$-dimensional hypercubes; when a query point lies within an incomplete hypercube, ndpolator finds the nearest fully defined hypercube and uses it to extrapolate the function value in the point of interest. While this is globally still considered interpolation as the query point is within the grid's definition range, the estimated function value is, strictly speaking, extrapolated from the nearest fully defined hypercube. Note that, when grids are particularly sparse and functios strongly non-linear, that can cause a substantial accumulation of error. In such cases, unstructured interpolation techniques might be a better fit.

Extrapolation modes

The fifth operating principle of ndpolator is extrapolation. Ndpolator has three extrapolation methods: none, nearest and linear. When extrapolation method is set to none, the function value that is outside the range of axes is set to nan. For extrapolation method nearest, ndpolator stores a list of all nodes and assigns a function value in the node that is nearest to the query point. Lastly, if extrapolation method is set to linear, ndpolator linearly extrapolates from the nearest fully defined hypercube in a manner equivalent to dealing with incomplete hypercubes. The choice for extrapolation method depends on the multi-variate function that we are estimating; if it is highly non-linear, extrapolation should be avoided, so none and nearest might be appropriate; if it is largely linear or varies slowly, then a linear extrapolation method might be warranted. Ndpolator is a linear extrapolator, so it cannot adequately estimate non-linear multi-variate functions.

Basic axes and associated axes

The question of grid completeness is quite impactful for performance; that is why the sixth operating principle of ndpolator is to distinguish between basic axes and associated axes. Axes that can have voids in their cartesian products are referred to as basic. For these axes, we need full ndpolator machinery to perform interpolation and extrapolation. On the other hand, a subset of axes may have all nodes in their cartesian products, i.e. they are guaranteed to be sampled in all vertices that basic axes are sampled in; these are referred to as associated axes. Given that their sampling is ascertained, interpolation and extrapolation can proceed without concerns for incomplete hypercubes -- that is, for as long as their basic hypercube counterparts (hypercubes spun by basic axes) are complete. Each associated axis reduces the dimensionality of the hypercubes that need to be stored for extrapolation lookup, thus optimizing performance further.

Function value dimensionality

The seventh and final operating principle concerns function value dimensionality. Most interpolators assume that the function value $\mathbf F$ is a scalar; ndpolator does not make that assumption. $\mathbf F_r(x_1, \dots, x_n)$ can be a scalar or a vector or arbitrary length $R$ (within reason, of course). It is then a requirement that all nodes are also $R$-dimensional. Ndpolator will then interpolate and extrapolate all function value components separately, and yield an $R$-dimensional estimate of the function value $\mathbf F$ in the point of interest.

Hypercube caching

While not explicitly a part of ndpolator's operating principles, ndpolator exposes two auxiliary functions, import_query_pts() and find_hypercubes(), that can be used to cache hypercubes. That way, a calling program can group query points that are enclosed by a single hypercube and perform bulk interpolation without the need to find the corresponding hypercube for each query point successively. While the indexing and the hypercube search are both binary, avoiding the lookup when possible further optimizes the runtime.

API documentation and tests

Ndpolator is released under the GNU General Public License. The Application Programming Interface (API) is available for the underlying C library on gh-pages. The test suite and automated API building are incorporated into github's Continuous Integration (CI) infrastructure. Any and all feedback, particularly issue reporting and pull requests, are most welcome.

Acknowledgements

Financial support for this project by the National Science Foundation, grant #2306996, is gratefully acknowledged.

Metadata

Release files for ndpolator 1.3.1

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

Source distribution (sdist)

Source distribution for ndpolator 1.3.1
File Size Uploaded
ndpolator-1.3.1.tar.gz 108.0 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for ndpolator 1.3.1
File
ndpolator-1.3.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
ndpolator-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-64 Details
ndpolator-1.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
ndpolator-1.3.1-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
ndpolator-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.13+ x86-64 Details
ndpolator-1.3.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
ndpolator-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-64 Details
ndpolator-1.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
ndpolator-1.3.1-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
ndpolator-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.13+ x86-64 Details
ndpolator-1.3.1-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
ndpolator-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details
ndpolator-1.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
ndpolator-1.3.1-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
ndpolator-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.9+ x86-64 Details
ndpolator-1.3.1-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
ndpolator-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-64 Details
ndpolator-1.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
ndpolator-1.3.1-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
ndpolator-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.9+ x86-64 Details
ndpolator-1.3.1-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
ndpolator-1.3.1-cp39-cp39-musllinux_1_2_x86_64.whl CPython 3.9 CPython 3.9 Linux musl 1.2+ x86-64 Details
ndpolator-1.3.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
ndpolator-1.3.1-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details
ndpolator-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.9+ x86-64 Details

Total release size: 1.7 MB

Release files / ndpolator-1.3.1.tar.gz

Download URL ndpolator-1.3.1.tar.gz
Size 108.0 kB
Tags Source
SHA-256 checksum
How to use checksums
f11ca82adb0ded292048f4e5ef61c63f1e07346ecd68fb874958d0268bdba869
BLAKE2b-256 checksum
How to use checksums
1e7382542bd4ee5465f806fd0d565f644e1808af0028b04d3253c2c5dc74b365
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp313-cp313-win_amd64.whl

Download URL ndpolator-1.3.1-cp313-cp313-win_amd64.whl
Size 42.3 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
5f8e664295741b0222ea91faec45a004bb0c639397b0525c0a5e891250e502df
BLAKE2b-256 checksum
How to use checksums
982d001eea1fb1b3a9250c3ddb98bdd46a0f19c96d2fff6b94cd93f43e2cc66c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl

Download URL ndpolator-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl
Size 95.4 kB
Tags CPython 3.13 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
2e9a600c786a01aed7f1941c7740f8fa76a97edc7fbbd19491c0f4734b0d806d
BLAKE2b-256 checksum
How to use checksums
276ec8f116afd6db0c091aa71a6ef165aae59aa19d7bbe435bb48d9e295a69e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL ndpolator-1.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 97.5 kB
Tags CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
9cca468251df886ec60e79bd1c5e4bf7913ac09999e59e4c4c98a6602aeb92cd
BLAKE2b-256 checksum
How to use checksums
0ab137514e2d84a94afb9f4d0b9879c4d7402d41d78f61d8b28ca73cc5c0003b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp313-cp313-macosx_11_0_arm64.whl

Download URL ndpolator-1.3.1-cp313-cp313-macosx_11_0_arm64.whl
Size 45.7 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
6e162dbaf0757b079477ec241dda342e3621982c54449d9c1c487a6aaac1c311
BLAKE2b-256 checksum
How to use checksums
a6bedf7d5b4e52725f4a95848321bbf594c069e23f4a09cd4de54375dd61a467
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl

Download URL ndpolator-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl
Size 45.6 kB
Tags CPython 3.13 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
adfb922926765eff7f2421c657355d47952667c44304e0e2e852a56dc6bb7dd3
BLAKE2b-256 checksum
How to use checksums
45dbece9be370a2900277516f310435502cd2da39387d76e256fd689b63eea0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp312-cp312-win_amd64.whl

Download URL ndpolator-1.3.1-cp312-cp312-win_amd64.whl
Size 42.3 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
c417b26b08e3089d80a0788ab313fe37ff5ad05e14d3be210edc2fe169693345
BLAKE2b-256 checksum
How to use checksums
5844d20ba1534b2d2a8287f61121d937475884900659ea3203c221a65685187c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl

Download URL ndpolator-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl
Size 95.3 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
be25c244d74221da184aa06d0a94d13d33164102e22f292c2f0ae827b7b1e08a
BLAKE2b-256 checksum
How to use checksums
a5887dd62fc4c88d3fa8a6e04257e35cdd99078d4a5d558e5e1c402f365389ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL ndpolator-1.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 97.5 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
a89a65bb0075b5522c359e0e6500f3e4e872092f12d2094502439a396d284af5
BLAKE2b-256 checksum
How to use checksums
95f604bda11259b526de9dff6d400001c04d9d2012c462498695a099416f6bee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp312-cp312-macosx_11_0_arm64.whl

Download URL ndpolator-1.3.1-cp312-cp312-macosx_11_0_arm64.whl
Size 45.7 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
283b0346ae3ed0dee87f0863b3a94cfde6a433ee6d9ca81a46ab29117c4a9ca3
BLAKE2b-256 checksum
How to use checksums
99b18ecae0f4ae90f54d771c630edf9f3b507a1d07149ca05728702cee9ed530
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl

Download URL ndpolator-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl
Size 45.6 kB
Tags CPython 3.12 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
9e0705409cc78bd40cd1fa599fa4fcfef84c61812934ef584b7c5f533544b08a
BLAKE2b-256 checksum
How to use checksums
97985b6954dea5d2ee6fdf9aa0726dba4fa2ed146df6e50281d40c49a5964cca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp311-cp311-win_amd64.whl

Download URL ndpolator-1.3.1-cp311-cp311-win_amd64.whl
Size 42.3 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
2de51c6a38348bdea64aec94c6a07d023b14932023debd14962be811f6e4b22c
BLAKE2b-256 checksum
How to use checksums
e0ff013313114eee24a577305dd448c1c12116d29901b4c9a78f17019eab88e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL ndpolator-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl
Size 94.6 kB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
9f08c1b55a33e6386b957d5cfbb6115d3d5940088bb59c76a351fb6100dbf387
BLAKE2b-256 checksum
How to use checksums
0132de10d218c1460dfb61c12492483a2328de21a226f3afc8131c96a69b8041
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL ndpolator-1.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 96.6 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
1a689f52aebc55a21d30a0ad280211562024b384d64fe3ccd0cc822d0fd22dd1
BLAKE2b-256 checksum
How to use checksums
4b8ef59659f4216e0737710683305cad40e37c1e89ffe925634d8d22ef4d1bba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp311-cp311-macosx_11_0_arm64.whl

Download URL ndpolator-1.3.1-cp311-cp311-macosx_11_0_arm64.whl
Size 45.7 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d482997c822916da20eb7b177480c628ebdf164387b645e981722021f1faafad
BLAKE2b-256 checksum
How to use checksums
f385b07ecb37ce4a8e90b9db10bfa94abe15b135edb4c8c6b52299fa8cc51ccd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl

Download URL ndpolator-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl
Size 45.4 kB
Tags CPython 3.11 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
3969c19a2425aa81b971bffab5d2c646538f1ce9aa4b46c615f669ccc5d89a8f
BLAKE2b-256 checksum
How to use checksums
ef084f2d813c2f03f4409c64e19fc39b814215349d7d4822b30fa3c3d4c68e94
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp310-cp310-win_amd64.whl

Download URL ndpolator-1.3.1-cp310-cp310-win_amd64.whl
Size 42.3 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
12a5299649b83bc49a3458c8df31ec6ad8a6464b2ed2b2e25194c6e18956735d
BLAKE2b-256 checksum
How to use checksums
d3cadf70250c0662933df7455125626f1b9fc82a837b727ce0a87cc7a90c1e18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl

Download URL ndpolator-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl
Size 94.2 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
d20a3be6c8f50ecf818e9118083eb090a11f73352ea3331965a6fb983cc7af37
BLAKE2b-256 checksum
How to use checksums
e1c85f1b59453bc0d93f3268a38e65e05017b95dd70d7deb87cdc18c0f2cb828
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL ndpolator-1.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 96.2 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
c1297bd4f4f1d5c7e3530de90c68294c2b7b3f3f990a10d9f2c39abca94c982d
BLAKE2b-256 checksum
How to use checksums
cbc5eac3e21283f7477a037a239fce738227d00662318052abd841538d40e44d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp310-cp310-macosx_11_0_arm64.whl

Download URL ndpolator-1.3.1-cp310-cp310-macosx_11_0_arm64.whl
Size 45.7 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
27740ad3f431203e36275abf6b90453d65d3618ecf6e56abfbd45c52b09d0ae5
BLAKE2b-256 checksum
How to use checksums
5e25ab0fcbae2f9239f8eee3348f60017fe6b63024ef32e9209169d53abb2b8e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl

Download URL ndpolator-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl
Size 45.4 kB
Tags CPython 3.10 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
49d2461a3d2e970ce1d15f1dd4808043cf46245593c04ebac3605a257b82725a
BLAKE2b-256 checksum
How to use checksums
cd7e9fa30fdc2ac53a89020fe7fa800cda81e9a3cbdb2641d68a7ed706f69e6b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp39-cp39-win_amd64.whl

Download URL ndpolator-1.3.1-cp39-cp39-win_amd64.whl
Size 42.3 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
fdac2c9fc52058870a14a6951c3fe6dca7555ba83dc51904531f1e286d7d195e
BLAKE2b-256 checksum
How to use checksums
a396213bf9fd22d87037ddc2004d6cca041d8fb9f00075a2be7cf131a896b672
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp39-cp39-musllinux_1_2_x86_64.whl

Download URL ndpolator-1.3.1-cp39-cp39-musllinux_1_2_x86_64.whl
Size 94.2 kB
Tags CPython 3.9 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
c8da34f92740c0dfa434668f891adafaa82c47fc4c164e64e9cba36f1aebd801
BLAKE2b-256 checksum
How to use checksums
837e83b4c2c4f79807c493736aa041d0c8e373f1a8bf77306633a36c831c0303
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL ndpolator-1.3.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 96.2 kB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
8b8f9d738bacf48c289b6ae5cbdb6fb3c91be97fce3610a52932a19a5ce0e652
BLAKE2b-256 checksum
How to use checksums
bc0f1367b76d629dfc923a833cac4f6b78192062db994d9c250465e3e464572b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp39-cp39-macosx_11_0_arm64.whl

Download URL ndpolator-1.3.1-cp39-cp39-macosx_11_0_arm64.whl
Size 45.7 kB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
81a49437ccfdb963841e0dd5141d63ffab32867776c933d7a20b5087dc18ac17
BLAKE2b-256 checksum
How to use checksums
b31dd02bdf2a923c8685ccc75127ed015fc228c8a9b5ae52ee7e29d538cc6483
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / ndpolator-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl

Download URL ndpolator-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl
Size 45.4 kB
Tags CPython 3.9 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
f3d567fdd3412ab9be211a41f53f219e54e7a31ed91e2bc9caf1bbe791af61d3
BLAKE2b-256 checksum
How to use checksums
635a2a8ae582036bb999849f9ac4ad0acd8e51534c5eaa4edfbf16f8834bc571
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.3.1 This release

26 release files

1.2.3

44 release files

1.2.1

51 release files

1.2

51 release files

1.1

1 release file

1.0

1 release file

0.1

1 release file

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