fastersom
A small, fast batch self-organising map (SOM) in PyTorch: a reimplementation of Kohonen's batch map with a
rectangular grid, gaussian neighbourhood and exponentially decaying neighbourhood width. Its defaults reproduce the
maps of spatiomic's so.dimension.som. Data stays on the device (CUDA,
MPS or CPU) and the per-epoch update uses per-node sums, so an epoch costs one BMU search plus a (nodes x nodes) matrix
product.
Install
uv add fastersom # or: pip install fastersom
Usage
import numpy as np
from fastersom import SOM
X = np.load("pixels.npy") # (n, d) or (..., d); numpy, array-like or torch
som = SOM(n_rows=30, n_cols=30, n_epochs=10, random_state=0) # device: cuda > mps > cpu
som.fit(X)
som.weights_ # (900, d) node weights, node = row * n_cols + col
som.labels_ # BMU index per training sample
labels = som.predict(X) # BMU index per sample
labels, dist = som.predict(X, return_distance=True) # and the distance to it, in the same pass
dist = som.transform(X) # (n, 900) distance to every node
umatrix = som.distance_map() # (30, 30) summed distance to the grid neighbours, max 1
print(som.quantization_error(X), som.topographic_error(X))
som = SOM.from_weights(som.weights_, n_rows=30, n_cols=30) # fitted map from saved weights, no data needed
Options:
metricsets the distance used for BMUs, distances and error measures:"euclidean"(default),"manhattan"(L1),"cosine"(1 - cosine similarity) or"correlation"(1 - Pearson correlation). Nodes are always updated to the neighbourhood-weighted mean of the raw samples (not the median under manhattan, nor centred samples under correlation). Zero-norm samples under cosine and constant samples under correlation have no BMU: they get label -1 and distance NaN inpredict, distance 1 intransform, and are left out of the update and the error measures.init="sample"initialises the nodes from random samples instead of seeded random unit vectors. An array of shape(n_rows * n_cols, d)or(n_rows, n_cols, d)gives the initial weights instead, e.g. for a warm start (SOM(init=som.weights_).fit(X)); withn_epochs=0,fitkeeps them unchanged. The sigma schedule restarts atsigma_initial, which with the default largely retrains the map; to continue training instead, pass a smallsigma_initial, e.g. the previous map'ssigma_final.sigma_initialandsigma_finalset the neighbourhood width schedule; the defaults reproduce spatiomic.batch_sizebounds memory (aboutbatch_size x n_nodesfloats) without changing the algorithm.
Fitted maps pickle without device tensors and load on the configured device if available, else on the default one,
so a map fitted on a GPU loads on a CPU-only machine. BatchSOM is an alias for SOM.
Benchmark
480,000 x 34 pixels, 30 x 30 nodes, 10 epochs, fit time only (mean of seeds 0-2):
| implementation | hardware | fit time | quantization error |
|---|---|---|---|
| fastersom | NVIDIA A100 | 0.085 s | 0.169 |
| spatiomic (CuPy) | NVIDIA A100 | 0.46 s | 0.169 |
| spatiomic (NumPy) | 256-core CPU | 40 s | 0.169 |
Algorithm
fastersom follows Kohonen's batch map (T. Kohonen, Self-Organizing Maps, 3rd ed., Springer, 2001). Each epoch assigns
every sample to its best matching unit and sets every node to the neighbourhood-weighted mean of the samples, with
neighbourhood h(j, k) = exp(-||r_j - r_k||^2 / (2 sigma(t)^2)) on the grid coordinates r and
sigma(t) = sigma_initial * (sigma_final / sigma_initial) ** (t / n_epochs). There is no learning rate, because it
cancels in the batch update. Only the rectangular topology, gaussian neighbourhood and exponential decay are
supported.
Development
uv sync # installs the dev group: pytest, ruff, pre-commit, twine
uv run pre-commit install # ruff, uv-lock and file checks on every commit
uv run pytest
uv build && uv run twine check --strict dist/*
License
Apache-2.0
Metadata
Release files for fastersom 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| fastersom-0.2.0.tar.gz | 14.1 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastersom-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.5 kB
Release files / fastersom-0.2.0.tar.gz
| Download URL | fastersom-0.2.0.tar.gz |
|---|---|
| Size | 14.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bd7ea342789738410b9185d2f7b96c416634b505e67db45bbb5fd8d4205e4250
|
|
BLAKE2b-256 checksum How to use checksums |
c6b1aa46277306c54a6dd7e16ac34857f688c2521cbd5d830b7c61e13db7934b
|
| 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 Oct 22, 2026.
Transparency logRelease files / fastersom-0.2.0-py3-none-any.whl
| Download URL | fastersom-0.2.0-py3-none-any.whl |
|---|---|
| Size | 14.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8caf65b59e1f08cfcc5d05a4f07504f087d8f7b6834ebe95f3b287065a9da545
|
|
BLAKE2b-256 checksum How to use checksums |
63881faa95f95c36476024bccd55affe969a354bb99453ec5a7ca9eea096bee0
|
| 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 Oct 22, 2026.
Transparency logSecurity for fastersom 0.2.0
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for fastersom-0.2.0.tar.gz
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 Oct 22, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.