Skip to main content

einops style multi dimensional meshgrids

Project description

Einmesh Logo

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, 2, 7)

# 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.1.tar.gz (140.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.1-py3-none-any.whl (9.9 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for einmesh-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1147c87502ac16c641439cc7a49d76772f4414a7ce7ea27bfe0bc4f54c8a7017
MD5 34b78db0e53c04ab3af63d8b433b03e5
BLAKE2b-256 25aed12899429fa6267b95c8c7d2151f4e689404cb4098ce52a860a60acb517e

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for einmesh-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3b696720a1f62210fd593978576f61612218557c23df11f3e586236f3fed952e
MD5 f54822e9ad9368df12364a1bf7b92233
BLAKE2b-256 8ff75c54030fc94fa0112fcdeff5f3e710805aecaa2ed4e98b77fe102bb59de9

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