Changelog
4.2.1 - 2026-02-04
Bug fixes:
Fixed methods _cross_categorical, _cross_sandwich, multiply, tocsr of CategoricalMatrix and function _sandwich_cat_cat_limited_rows_cols to operate on read-only buffers as well.
4.2.0 - 2026-01-13
New feature:
tabmat.from_formula()now also supports any dataframe supported by narwhals.
Other changes:
Require Python>=3.10.
4.1.5 - 2025-12-17
Other changes:
Restore building wheels for Intel-based macOS systems.
4.1.4 - 2025-12-16
Other changes:
tabmat.from_df()now avoids unnecessary copies of dense arrays, but still ensures that the results are contiguous (C or F order).We now use narwhals’ v2 API for data frame handling.
4.1.3 - 2025-11-12
Bug fixes:
Fixed
CategoricalMatrix.transpose_matvec()to operate on read-only buffers as well.Fixed incorrect calculation of the shape of a
CategoricalMatrixwhen initialized with zero categories anddrop_first=True.
4.1.2 - 2025-07-17
Bug fixes:
Fixed a bug which caused issues when constructing tabmat matrices from existing
ModelSpecs when they contained categorical columns with all levels dropped.We can now treat dedicated pandas string series - which are the defaults for strings since pandas 2.3 - as categoricals.
4.1.1 - 2025-01-30
Bug fix:
A more robust
DenseMatrix._get_col_stds()results in more accurateStandardizedMatrix.sandwich()results.
Other changes:
Build wheel for pypi on python 3.13.
Build and test with python 3.13 in CI.
4.1.0 - 2024-11-07
New feature:
Added a new function,
tabmat.from_df(), to convert any dataframe supported by narwhals into atabmat.SplitMatrix.
Other changes:
Allow
CategoricalMatrixto be initialized directly with indices and categories.Added checks for dimension and
dtypemismatch inMatrixBasesandwich.sandwich().
Bug fix:
Fixed a bug in
tabmat.CategoricalMatrix.standardize()that sometimes returnednanvalues for the standard deviation due to numerical instability if usingnp.float32precision.
4.0.1 - 2024-06-25
Other changes:
Removed reference to the
.Aattribute and replaced it with.toarray().Add support between formulaic and pandas 3.0.
Support pypi release for numpy 2.0
4.0.0 - 2024-04-23
Breaking changes:
To unify the API,
DenseMatrixdoes not inherit fromnp.ndarrayanymore. To convert aDenseMatrixto anp.ndarray, useDenseMatrix.unpack().Similarly,
SparseMatrixdoes not inherit fromsps.csc_matrixanymore. To convert aSparseMatrixto asps.csc_matrix, useSparseMatrix.unpack().
New features:
Added column name and term name metadata to
MatrixBaseobjects. These are automatically populated when initializing aMatrixBasefrom apandas.DataFrame. In addition, they can be accessed and modified via theMatrixBase.column_namesandMatrixBase.term_namesproperties.Added a formula interface for creating tabmat matrices from pandas data frames. See
tabmat.from_formula()for details.Added support for missing values in
CategoricalMatrixby either creating a separate category for them or treating them as all-zero rows.Added support for handling missing categorical values in pandas data frames.
Bug fix:
Added cython compiler directive
legacy_implicit_noexcept = Trueto fix performance regression with cython 3.
Other changes:
Refactored the pre-commit hooks to use ruff.
Refactored
CategoricalMatrix.transpose_matvec()to be deterministic when using OpenMP.Adjusted transformation to sparse format in
tabmat.from_pandas()to future changes in pandas.
3.1.13 - 2023-10-17
Other changes:
Pypi release is now done using trusted publisher.
Fix build and upload of
x86_64wheels on Linux.
3.1.12 - 2023-10-16
Other changes:
Fixed macos arm64 wheels with proper linkage.
3.1.11 - 2023-10-13
Other changes:
Improve the performance of
from_pandasin the case of low-cardinality categorical variables.Require Python>=3.9 in line with NEP 29
Build and test with Python 3.12 in CI.
Fixed macos arm64 wheels with proper linkage.
3.1.10 - 2023-06-23
Bug fixes:
We fixed a bug in the dense sandwich product, which would previously segfault for very large matrices.
Fixed the column order when initializing a
SplitMatrixfrom a list containing otherSplitMatrixobjects.Fixed
getcolnot respecting thedrop_firstattribute of aCategoricalMatrix.
3.1.9 - 2023-06-16
Other changes:
Support building on architectures that are unsupported by xsimd.
3.1.8 - 2023-06-13
Other changes:
The C++ types have been refactored. Loop indices are now using the
Py_ssize_ttype. Integers now have a templated type as well.The documentation for
matvecandmatvec_transposehas been updated to reflect actual behavior.Checks for dimension mismatch in
matvecandmatvec_transposearguments have been added.Remove upper pin on xsimd.
3.1.7 - 2022-03-28
Bug fix:
We fixed a bug in the cross sandwich product, which would previously segfault for very large matrices.
3.1.6 - 2022-03-27
Bug fix:
We fixed a bug in the dense sandwich product, which would previously segfault for very large F-contiguous matrices.
3.1.5 - 2022-03-20
Bug fix:
We fixed a bug in the dense matrix-vector and sandwich products, which would previously segfault for very large matrices.
3.1.4 - 2022-02-07
Bug fix:
Fixed the loading of jemalloc in Apple Silicon wheels.
3.1.3 - 2022-01-26
Other changes:
Build and upload wheels for Apple Silicon.
3.1.2 - 2022-07-01
Other changes:
Next attempt to build wheel for PyPI without
march=native.
3.1.1 - 2022-07-01
Other changes:
Add Python 3.10 support to CI (remove Python 3.6).
Build wheel for PyPI without
march=native.
3.1.0 - 2022-03-07
New feature
tabmat.CategoricalMatrixnow accepts a drop_first argurment. This allows the user to drop the first column of a CategoricalMatrix to avoid multicollinearity problems in unregularized models.tabmat.StandardizedMatrixandtabmat.MatrixBasenow support the multiply method.
3.0.8 - 2022-01-03
Bug fix
Always use 64bit integers for indexing in
tabmat.ext.sparse.sparse_sandwich()to avoid segmentation faults on very wide problems.
3.0.7 - 2021-11-23
Bug fix
Disable the use of static TLS in the Linux wheels to avoid issues with too small TLS on some distributions.
3.0.6 - 2021-11-11
Bug fix
We fixed a bug in
tabmat.SplitMatrix.matvec(), where incorrect matrix vector products were computed when aSplitMatrixdid not contain any dense components.
3.0.5 - 2021-11-05
Other changes
We are now specifying the run time dependencies in
setup.py, so that missing dependencies are automatically installed from PyPI when installingtabmatvia pip.
3.0.4 - 2021-11-03
Other changes
tabmat is now available on PyPI and will be automatically updated when a new release is published.
3.0.3 - 2021-10-15
Bug fix
We now support
xsimd>=8and support alternative jemalloc installations.
3.0.2 - 2021-10-14
Bug fix
Allow to link to alternatively suffixed jemalloc installation to work around #113 .
3.0.1 - 2021-10-07
Bug fix
The license was mistakenly left as proprietary. Corrected to BSD-3-Clause.
Other changes
ReadTheDocs integration.
CONTRIBUTING.md
Correct pyproject.toml to work with PEP-517
3.0.0 - 2021-10-07
Breaking changes:
The package has been renamed to
tabmat. CELEBRATE!The
one_over_var_inf_to_val()function has been made private.The
csc_to_split()function has been re-named totabmat.from_csc()to match thetabmat.from_pandas()function.The
tabmat.MatrixBase.get_col_means()andtabmat.MatrixBase.get_col_stds()methods have been made private.The
cross_sandwich()method has also been made private.
Bug fix
StandardizedMatrix.transpose_matvec()was giving the wrong answer when the out parameter was provided. This is now fixed.SplitMatrix.__repr__()now calls the __repr__ method of component matrices instead of __str__.
Other changes
Optimized the
tabmat.SparseMatrix.matvec()andtabmat.SparseMatrix.transpose_matvec()for whenrowsandcolsare None.Implemented
CategoricalMatrix.__rmul__()Reorganizing the documentation and updating the text to match the current API.
Enable indexing the rows of a
CategoricalMatrix. PreviouslyCategoricalMatrix.__getitem__()only supported column indexing.Allow creating a
SplitMatrixfrom a list of anyMatrixBaseobjects including anotherSplitMatrix.Reduced memory usage in
tabmat.SplitMatrix.matvec().
2.0.3 - 2021-07-15
Bug fix
In
SplitMatrix.sandwich(), when a col subset was specified, incorrect output was produced if the components of the indices array were not sorted.SplitMatrix.__init__()now checks for sorted indices and maintains sorted index lists when combining matrices.
Other changes
SplitMatrix.__init__()now filters out any empty matrices.StandardizedMatrix.sandwich()passesrows=Noneandcols=Noneonwards to the underlying matrix instead of replacing them with full arrays of indices. This should improve performance slightly.SplitMatrix.__repr__()now includes the type of the underlying matrix objects in the string output.
2.0.2 - 2021-06-24
Bug fix
Sparse matrices now accept 64-bit indices on Windows.
2.0.1 - 2021-06-20
Bug fix:
Split matrices now also work on Windows.
2.0.0 - 2021-06-17
Breaking changes:
We renamed several public functions to make them private. These include functions in tabmat.benchmark that are unlikely to be used outside of this package as well as
tabmat.dense_matrix._matvec_helper()
tabmat.sparse_matrix._matvec_helper().
tabmat.split_matrix._prepare_out_array().
Other changes:
We removed the dependency on
sparse_dot_mkl. We now usescipy.sparse.csr_matvec()instead ofsparse_dot_mkl.dot_product_mkl()on all platforms, because the former suffered from poor performance, especially on narrow problems. This also means that we removed the functiontabmat.sparse_matrix._dot_product_maybe_mkl().We updated the pre-commit hooks and made sure the code is line with the new hooks.
1.0.6 - 2020-04-26
Other changes:
We are now also making releases for Windows.
1.0.5 - 2020-04-26
Other changes:
Still trying.
1.0.4 - 2020-04-26
Other changes:
We are trying to make releases for Windows.
1.0.3 - 2020-04-21
Bug fixes:
Added a check that matrices are two-dimensional in the
SplitMatrix.__init__Replace
np.intwithnp.int64where appropriate due to NumPy deprecation ofnp.int.
1.0.2 - 2020-04-20
Other changes:
Added Python 3.9 support.
Use
scipy.sparsedot product when MKL isn’t available.
1.0.1 - 2020-11-25
Bug fixes:
Handling for nulls when setting up a
CategoricalMatrixFixes to make several functions work with both row and col restrictions and out
Other changes:
Added various tests and documentation improvements
1.0.0 - 2020-11-11
Breaking change:
Rename dot to matvec. Our dot function supports matrix-vector multiplication for every subclass, but only supports matrix-matrix multiplication for some. We therefore rename it to matvec in line with other libraries.
Bug fix:
Fix a bug in matvec for categorical components when the number of categories exceeds the number of rows.
0.0.6 - 2020-08-03
See git history.