Skip to main content

einops style multi dimensional meshgrids

Project description

einmesh

einops-style multi dimensional meshgrids

Release Build status Commit activity License

Installation

Simple installation from pip:

pip install einmesh

or uv

uv add einmesh

Features

  • einops-style Meshgrid Generation: The core function einmesh allows creating multi-dimensional meshgrids (like torch.meshgrid) using a concise string pattern similar to einops.
  • Flexible Space Definitions: Users define the dimensions using various "space" objects:
    • LinSpace: Linearly spaced points.
    • LogSpace: Logarithmically spaced points.
    • UniformDistribution: Points sampled from a uniform distribution.
    • NormalDistribution: Points sampled from a normal distribution.
  • Pattern Features:
    • Named Dimensions: Pattern elements correspond to keyword arguments (e.g., einmesh("x y", x=LinSpace(...), y=LogSpace(...))).
    • Dimension Ordering: The order in the pattern determines the order/shape of the output tensors (using ij indexing convention, like NumPy).
    • Stacking (*): A * in the pattern stacks the individual coordinate tensors along a new dimension, returning a single tensor.
    • Grouping (()): Parentheses group axes for rearrangement using einops.rearrange.
    • Duplicate Names: Handles patterns like "x x y", which repeats an axis and re-samples it.
  • Output:
    • Returns a tuple of coordinate tensors if no * is present.
    • Returns a single stacked tensor if * is present.
  • Backend: Uses torch tensors and torch.meshgrid internally.

Examples

Here are a few examples demonstrating how to use einmesh:

1. Basic 2D Linear Grid

Create a simple 2D grid with linearly spaced points along x and y.

import torch
from einmesh import einmesh, LinSpace

# Define the spaces
x_space = LinSpace(0, 1, 10)  # 10 points from 0 to 1
y_space = LinSpace(-1, 1, 20) # 20 points from -1 to 1

# Create the meshgrid
# Output: tuple of two tensors, each with shape (10, 20) following 'ij' indexing
x_coords, y_coords = einmesh("x y", x=x_space, y=y_space)

print(x_coords.shape, y_coords.shape)
# Output: torch.Size([10, 20]) torch.Size([10, 20])

2. Stacked Coordinates

Create a 3D grid and stack the coordinate tensors into a single tensor.

import torch
from einmesh import einmesh, LinSpace, LogSpace

x_space = LinSpace(0, 1, 5)
y_space = LinSpace(0, 1, 6)
z_space = LogSpace(1, 100, 7) # 7 log-spaced points from 1 to 100

# Use '*' to stack the coordinates along the last dimension
# Output: single tensor with shape (5, 6, 7, 3)
coords = einmesh("x y z *", x=x_space, y=y_space, z=z_space)

print(coords.shape)
# Output: torch.Size([5, 6, 7, 3])
# coords[..., 0] contains x coordinates
# coords[..., 1] contains y coordinates
# coords[..., 2] contains z coordinates

3. Using Distributions

Generate grid points by sampling from distributions.

import torch
from einmesh import einmesh, UniformDistribution, NormalDistribution

# Sample 10 points uniformly between -5 and 5 for x
x_dist = UniformDistribution(-5, 5, 10)
# Sample 15 points from a normal distribution (mean=0, std=1) for y
y_dist = NormalDistribution(0, 1, 15)

# Create the meshgrid
# Output: tuple of two tensors, each with shape (10, 15)
x_samples, y_samples = einmesh("x y", x=x_dist, y=y_dist)

print(x_samples.shape, y_samples.shape)
# Output: torch.Size([10, 15]) torch.Size([10, 15])
# Note: The points along each axis will not be sorted.

4. Duplicate Dimension Names

Use the same space definition for multiple axes.

import torch
from einmesh import einmesh, LinSpace

space = LinSpace(0, 1, 5)

# 'x' space is used for both the first and second dimensions.
# Output shapes: (5, 5, 10) for each tensor
x0_coords, x1_coords, y_coords = einmesh("x x y", x=space, y=LinSpace(-1, 1, 10))

print(x0_coords.shape, x1_coords.shape, y_coords.shape)
# Output: torch.Size([5, 5, 10]) torch.Size([5, 5, 10]) torch.Size([5, 5, 10])

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

einmesh-0.1.0.tar.gz (138.0 kB view details)

Uploaded Source

Built Distribution

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

einmesh-0.1.0-py3-none-any.whl (8.9 kB view details)

Uploaded Python 3

File details

Details for the file einmesh-0.1.0.tar.gz.

File metadata

  • Download URL: einmesh-0.1.0.tar.gz
  • Upload date:
  • Size: 138.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.2

File hashes

Hashes for einmesh-0.1.0.tar.gz
Algorithm Hash digest
SHA256 dca392191e27e4a4323d5ebdd1bb7ce6ed8d7cf26d076a0adc6d46d727fc7cc5
MD5 40413815a2009407e6ae21082fa6472e
BLAKE2b-256 cdc618414d944952f932db2e518b2f4098424bee07752570c4cbd9217da489f3

See more details on using hashes here.

File details

Details for the file einmesh-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: einmesh-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 8.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.2

File hashes

Hashes for einmesh-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 05a8ea3fd51e4084be954e251d42b6a1e656a9003b8ee520fd7eef2521d9f36d
MD5 c82462506175adb3d7848ea1003318ea
BLAKE2b-256 089e5c84052e2851e449e5a0cbd007af6a09679336f343b531ff1ff9656fb7e3

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