NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1736 most downloaded on PyPI
Matrices describing affine transformation of the plane
Last release 1 months ago
28 Aug 2026
Release timing varies
gaps range from 3 weeks to 2.6 years
Nearly every release is documented
notes for 15 of 16 stable releases
Nothing withdrawn
no release was ever pulled
12 years old
24 releases · first in 2014
Affine now raises PendingDeprecationWarning when the * operator is used for matrix multiplication ( gh-146 ). This is intended for developers to see.…
Deprecations:
Bug fixes:
One column per quarter.
This is 3.0.0. Thanks for your patience!
This is 3.0.0. Thanks for your patience!
Only one change has been made since 3.0rc3:
Affine.__array__() has been deleted to remove a dependency on Numpy and associated typing annotations (#140). To convert an Affine instance to a Numpy array, do this: numpy.array(Affine()).reshape(3, 3).The single file module affine.py has been moved to affine/__init__.py so that a py.typed file can be distributed in the same directory ( #136 ).
The single file module affine.py has been moved to affine/__init__.py so that a py.typed file can be distributed in the same directory (#136).
3.0rc1 tagged the wrong commit. The distributions on PyPI have the correct version, but the GitHub release does not. This is fixed by 3.0rc2, which ma
3.0rc1 tagged the wrong commit. The distributions on PyPI have the correct version, but the GitHub release does not. This is fixed by 3.0rc2, which makes no other changes.
This is the first 3.0 release candidate. There are no significant changes since 3.0b1.
This is the first 3.0 release candidate. There are no significant changes since 3.0b1.
The second 3.0 pre-release has a single bug fix. Matrix multiplication with tuples of coordinate matrices, like the output of numpy.meshgrid() , was b
The second 3.0 pre-release has a single bug fix. Matrix multiplication with tuples of coordinate matrices, like the output of numpy.meshgrid(), was broken in 3.0a1. It has been restored (#126).
This is the first pre-release of Affine version 3.0. There is one major, potentially breaking change: the Affine class is no longer a named tuple, and…
This is the first pre-release of Affine version 3.0. There is one major, potentially breaking change: the Affine class is no longer a named tuple, and is no longer serializable to JSON without an adapter of some kind. That said, Rasterio 1.4 needed only minor changes to work with Affine 3.0, and we hope that other projects are similarly easy to update.
__array__() interface (#108).@ matrix multiplier methods (#122).Package is marked as Python 3 only, two instances of "%" string formatting are replaced by f-strings (#96).
Elimination of Python 2/3 compatibility code in __gt__ (#94).
Return NotImplemented for both ValueError and TypeError in __mul__ to support fallback to __rmul__ in more cases (gh-71).
Bug fixes:
Right multiplication like vector * matrix is deprecated and will raise AffineError in version 3.0.0.
Deprecations:
Bug fixes:
Affine.itransform computed the wrong results for arrays with rotation or shear (#40). This is fixed (#41).
- Docstring improvements (#37).
Addition of permutation matrix (#35).
Addition of new eccentricity and rotation_angle properties (#28).
eccentricity and rotation_angle properties (#28).This is the final 2.0.0 release. The post-release version segment is used because we accidentally uploaded a 2.0.0 to PyPI before the beta releases be
Nothing published for this version
Bug fix: restore Affine __rmul__ even though it permits dubious vector * matrix expressions (#27).
Affine __rmul__ even though it permits dubious
vector * matrix expressions (#27).Breaking change: precision used in properties like is_conformal is no longer a global module attribute, but an Affine class or instance attribute (#19…
is_conformal is no
longer a global module attribute, but an Affine class or instance attribute
(#19, #20).is_degenerate property is now exact and not subject to
a level of precision (#23).is_degenerate predicate is precise, not approximate (#22).
Enable pickling of Affine objects (#14).
Add loadsw/dumpsw world file utilities (#6).
set_epsilon() now actually sets module EPSILON (#4).
Code ported from Casey Duncan's Planar package.
Your coding agent can read these notes before it upgrades. Set up the MCP server →