Skip to main content

❒ Gridpoints — Multi dimensional sort for point clouds

Gridpoints maps unstructured point clouds to structured grids through a bijective transformation: one point, one cell, no overlap, fully invertible. It replaces and enhances the squarenet project with a more powerfull sorting algorithm.

What it does: Take raw point cloud P(N, D) and find a grid shape and an index permutation order such that Pgrid = P[order].reshape(*gridshape, D) is sorted along every axis of the grid. E.g. in 3D, for Pgrid = (x, y, z):

x[i+1, j, k] >= x[i, j, k]
y[i, j+1, k] >= y[i, j, k]
z[i, j, k+1] >= z[i, j, k]

→ On the Pgrid view of P, neighbor queries become a simple stencil look-up :

neighborhood[i, j, k] = {Pgrid[i±di, j±dj, k±dk] | (di, dj, dk) ≤ R},

where R is a radius cutoff to determine, allowing local operations in linear time.
→ Standard operations (convolution, clustering, …) can then be applied
directly on the Pgrid view instead of relying on complex graph convolutions
or other point-cloud techniques.

P can be a NumPy, PyTorch or CuPy array of any dimension (N, D).
To allow natural padding when the grid has more cells than points,
NaNs and Infs are supported in a consistent manner:

  • nans → random position
  • (+-) infs → border of the grid

This allow to gridsort prime or variable number of points N, as long as one is ready to deal with void/special grid cells.

Expected runtime for sorting 1 million points: CPU → < 10s (numpy), GPU → < 500 ms (torch cuda)


Installation

pip install gridpoints          # core only
pip install gridpoints[demo]    # for the demonstration notebook, see `notebook.ipynb`

Quickstart

import gridpoints as grid
import numpy as np

# Raw point cloud (numpy, pytorch or cupy)
A = np.random.rand(1_000_000, 3)

# Sorted view: place the points inside the grid
order = grid.argsort(A, gridshape=(100, 100, 100))
Bflat = A[order]
Bgrid = Bflat.reshape(100, 100, 100, 3)

# Rest of your pipeline, working with grids
Cgrid = apply_something(Bgrid)

# Back to the original points indexing
Cflat = Cgrid.reshape(-1, 3)
orderinv = grid.invert_permutation(order)
C = Cflat[orderinv]   # matches the initial points order

Note on the cutoff radius R

There is no strict theoretical guarantee about what the cutof radius R should be for a given task. E.g the relative grid position between a point and its nearest neighbors can't be garanted to be in the exact adjacent grid cells. What is guaranteed from the sorted ordering is only grid monotonicity: x coordinates increase along rows, y coordinates along columns, and so on.

As an example, empirical results in 2-D show that R = 5 is enough for ~99 % of the nearest neighbors; some outlier neighbors will sit further apart for complex geometries with pronounced peaks, holes or any non-smoothness. When a stricter neighborhood is required, or in high dimensional setting, the best practice is to build an assembly of grid experts, each working on a rotated / projected view of the points, as discussed in this topic.

Note on efficient stencil operations

The typical use-case of Gridpoints is to allow fast local operations on arbitrary point clouds using stencil kernels:

output(i, j, k) = f( Pgrid[i±di, j±dj, k±dk] | di, dj, dk in local window )

To go beyond standard (slow) python loops, this can be accelerated with native grid convolution operations of standard libraries whenever possible, or with pystencils or taichi compilers for complex/non linear grid kernels.

Metadata

Release files for gridpoints 1.0.6

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

Source distribution (sdist)

Source distribution for gridpoints 1.0.6
File Size Uploaded
gridpoints-1.0.6.tar.gz 14.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gridpoints 1.0.6
File Interpreter ABI Platform
gridpoints-1.0.6-py3-none-any.whl Python 3 none any Details

Total release size: 28.9 kB

Release files / gridpoints-1.0.6.tar.gz

Download URL gridpoints-1.0.6.tar.gz
Size 14.7 kB
Tags Source
SHA-256 checksum
How to use checksums
6ea026ac1764ca726906a7ee2f9ad39ac20b4b49be654641e2748fc7a758fcb3
BLAKE2b-256 checksum
How to use checksums
28e2f10849f020ad9d82e302c737c5df434c5b682f637ab2dbd6c8f727284b97
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / gridpoints-1.0.6-py3-none-any.whl

Download URL gridpoints-1.0.6-py3-none-any.whl
Size 14.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9561d00eb0248ceb63d4b14fb32d7f7e04b597843090e5ec9bfece57896bed63
BLAKE2b-256 checksum
How to use checksums
e1568e91c6527e1c29419b3f5feadac9c499d0b83b6890433078ec495e87a893
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release history Release notifications | RSS feed

1.0.7

2 release files

This release

1.0.6 This release

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

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