What’s new in the package¶
A catalog of new features, improvements, and bug-fixes in each release.
v0.12.dev¶
Deprecate
covariances_Xandcospectrum. #442 by @qbarthelemyAdd Python Array API support for NumPy/PyTorch backend transparency in core utility modules (
base,covariance,distance,mean,geodesic,tangentspace,ajd,kernel,median), enabling execution on both NumPy arrays and PyTorch tensors with optional GPU acceleration and autograd support. #433 by @bruAristimunhaMove geometry modules (
ajd,base,covariance,distance,geodesic,kernel,mean,median,tangentspace,test) frompyriemann.utilsto a new standalonepyriemann.geometrysubpackage. The old import paths (e.g.pyriemann.utils.mean,pyriemann.utils.kernel,pyriemann.utils.test) still work as backward-compatibility shims but emit aDeprecationWarning; rename topyriemann.geometry.<module>. The privatepyriemann.utils._backendandpyriemann._helpersmodules also moved intopyriemann.geometryso that the subpackage is fully standalone (no internal pyriemann imports outside of itself). Modulepyriemann.utils.utilsis renamed topyriemann.utils._checkwith the same shim+warning. Tests for moved modules are renamedtest_utils_*→test_geometry_*. #445 by @bruAristimunhaEnhance
pyriemann.geometry.geodesic.geodesic()to acceptalphaas an ndarray of shape(...,), allowing a different geodesic position per stacked matrix pair. #396 by @Fashad-AhmedAdd example on Riemannian curvature analysis of sentence trajectories in language model embeddings, demonstrating how local metric tensors (SPD matrices) capture geometric structure in LLM latent spaces and enable classification of semantically distinct sentences using MDM. #448 by @SzczepanK112 and @gcattan
Add example on simulated SPD matrices to compare metrics. #451 by @qbarthelemy
Add Bini-Meini-Poloni (BMP) mean
pyriemann.geometry.mean.mean_bmp(), and Cheap meanpyriemann.geometry.mean.mean_cheap(). #449 by @qbarthelemy
v0.11 (April 2026)¶
Enhance
pyriemann.datasets.sample_gaussian_spd()adding support for dispersion defined as a covariance matrix. #412 by @thibaultdesurrelAdd
pyriemann.clustering.GaussianMixture. #411 by @qbarthelemyEnhance
pyriemann.classification.NearestConvexHullto support “euclid” metric. #415 by @qbarthelemyDeprecate
mean_covariance, renamed intopyriemann.geometry.mean.gmean(). #419 by @qbarthelemyCorrect log-Euclidean parallel transport. #420 by @qbarthelemy
Add CI caching for Zenodo datasets to speed up documentation builds and avoid rate limiting. #417 by @bruAristimunha
Enhance
pyriemann.classification.TSClassifierandpyriemann.transfer.TLClassifierto support classifiers without sample weights. #422 by @qbarthelemyEnhance
pyriemann.clustering.PotatoField, allowing a different metric per potato and adding a parametermethod_combination. #423 by @qbarthelemyModernize documentation: migrate from Bootstrap to Furo theme, add card-based API navigation with sphinx-design, and fix Sphinx build warnings. #424 by @bruAristimunha
Add ORCID identifiers and new contributors to CITATION.cff. #424 by @bruAristimunha
Add functions to compute inner products. #428 by @qbarthelemy
Add broadcast compatibility for utility functions, enabling batched SPD/HPD matrix operations. Includes broadcast-compatible Mahalanobis distance. #426 by @bruAristimunha
Complete example on artifact detection by Riemannian potato field, adding a metric by potato. #431 by @DavoudYneuro
Enhance
pyriemann.geometry.covariance.covariance_scm()to estimate weighted sample covariance matrices. #434 by @qbarthelemy
v0.10 (January 2026)¶
Add example in gallery to compare clustering algorithms on synthetic datasets. #374 by @qbarthelemy
Enhance
pyriemann.classification.MeanField, to be used as a feature extractor. #377 by @qbarthelemyUpdate pyRiemann from Python 3.9 - 3.11 to 3.10 - 3.12. #378 by @qbarthelemy
Deprecate
fit_transform()ofpyriemann.spatialfilters.AJDCdue to incompatible dimensions. #382 by @qbarthelemyAdd
pyriemann.datasets.RandomOverSamplerfor data augmentation of positive-definite matrices. #387 by @qbarthelemyAdd
pyriemann.geometry.tangentspace.transport()for parallel transport of positive-definite matrices. #388 by @qbarthelemyEnhance
pyriemann.datasets.make_matrices()to generate invertible, orthogonal, unitary or non-square matrices. #389 by @qbarthelemyDeprecate
mean_identity. #392 by @qbarthelemyEnhance
pyriemann.tangentspace.TangentSpaceto support HPD matrices. #394 by @qbarthelemySpeedup of the ALM mean
pyriemann.geometry.mean.mean_alm(). #398 by @qbarthelemyAdd
pyriemann.geometry.geodesic.geodesic_chol()andpyriemann.geometry.mean.mean_chol(). #399 by @qbarthelemyAdd
pyriemann.geometry.tangentspace.transport_logchol()for parallel transport with log-Cholesky metric. #400 by @qbarthelemyAdd Thompson metric:
pyriemann.geometry.distance.distance_thompson(),pyriemann.geometry.geodesic.geodesic_thompson(), andpyriemann.geometry.mean.mean_thompson(). #401 by @qbarthelemyFix sklearn error
This Pipeline instance is not fitted yet. #406 by @qbarthelemyAdd
pyriemann.classification.NearestConvexHull. #405 by @qbarthelemy
v0.9 (July 2025)¶
Add conjugate transpose operator
pyriemann.geometry.base.ctranspose()for real- and complex-valued ndarrays. #348 by @qbarthelemyAdd
pyriemann.embedding.TSNE, a Riemannian t-SNE implementation and update example comparing embeddings. #347 by @thibaultdesurrelFix matplotlib warning. #351 by @qbarthelemy
Enhance
pyriemann.geometry.mean.mean_power()usinginit,tolandmaxiterparameters when p=0. #353 by @toncho11Enhance
pyriemann.geometry.distance.pairwise_distance()to support HPD matrices for “euclid”, “harmonic”, “logchol” and “logeuclid” metrics. #350 by @qbarthelemyAvoid duplicating code when using joblib. #359 by @qbarthelemy
Fix sklearn warning
This Pipeline instance is not fitted yet. #358 by @qbarthelemyAdd
pyriemann.geometry.tangentspace.log_map()andpyriemann.geometry.tangentspace.exp_map(). #363 by @qbarthelemyAdd
pyriemann.clustering.MeanShift, a Riemannian mean shift clustering algorithm. #364 by @qbarthelemyFix
pyriemann.spatialfilters.Xdawnto remove the parameterssample_weightthat is not used on the fit_transformation. #371 by @bruAristimunha
v0.8 (February 2025)¶
Enhance
pyriemann.geometry.mean.mean_ale()addinginitparameter, and add functioncheck_init()useful to all ajd and mean functions allowing initialization. #328 by @qbarthelemyEnhance
mean_covarianceto support “power” and “poweuclid” metrics. #329 by @qbarthelemyAdd tangent space alignment (TSA) in transfer learning module.
TLStretchis deprecated and renamed intopyriemann.transfer._estimators.TLScale, andTSclassifierintopyriemann.classification.TSClassifier. #320 by @qbarthelemyAdd an example using fNIRS data with a new estimator called
HybridBlocksfor classifying HbO and HbR signals. #323 by @timnaherAdd directional derivatives
pyriemann.geometry.base.ddexpm()andpyriemann.geometry.base.ddlogm(), and correctpyriemann.geometry.tangentspace.log_map_logeuclid()andpyriemann.geometry.tangentspace.exp_map_logeuclid(). #332 by @gabelsteinAdd
pyriemann.geometry.tangentspace.exp_map_wasserstein(),pyriemann.geometry.tangentspace.log_map_wasserstein()andpyriemann.geometry.geodesic.geodesic_wasserstein(). #331 by @gabelsteinEnhance
pyriemann.datasets.make_matrices(), to generate symmetric and Hermitian matrices, and add parameters defining the normal distribution to draw eigen vectors. Deprecategenerate_random_spd_matrix. #339 by @qbarthelemyEnhance TSA, adding weights to transformers, and generalizing
pyriemann.transfer._estimators.TLRotatefrom one-to-one to many-to-one domain adaptation in tangent space. #337 by @qbarthelemyEnhance
pyriemann.geometry.kernel.kernel_euclid()andpyriemann.geometry.kernel.kernel_logeuclid()addingCrefparameter, and correctpyriemann.geometry.kernel.kernel_riemann()whenYis different fromXandCrefis None. #340 by @qbarthelemySpeedup of the Wasserstein mean
pyriemann.geometry.mean.mean_wasserstein()and extension of transport functionpyriemann.geometry.tangentspace.transport(). #341 by @gabelstein
v0.7 (October 2024)¶
Add
kernelparameter topyriemann.embedding.LocallyLinearEmbedding. #293 by @gabelsteinAdd possibility for
target_domainparameter ofpyriemann.transfer._estimators.TLCenterto be empty, forcingtransform()to recenter matrices to the last fitted domain. #292 by @brunaaflEnhance
pyriemann.geometry.ajd.ajd_pham()andpyriemann.geometry.mean.mean_ale()functions to process HPD matrices. #299 by @qbarthelemyAdd
partial_fitfunction topyriemann.preprocessing.Whiteningfor online applications. #277 by @qbarthelemy and @brentgaisfordAdd
get_weightsfixture to conftest and complete tests. #305 by @qbarthelemyEnhance
pyriemann.estimation.Shrinkageto process HPD matrices. #307 by @qbarthelemyAdd remote sensing examples on radar image clustering. #306 by @AmmarMian
Add
sample_weightparameter toMDM.fit_predict,Potato.fit,Potato.partial_fit,PotatoField.fit,PotatoField.partial_fit,Whitening.partial_fit. #309 by @qbarthelemyUpdate pyRiemann from Python 3.8 - 3.10 to 3.9 - 3.11. #310 by @qbarthelemy
Add
pyriemann.geometry.distance.distance_logchol()to compute log-Cholesky distance. #311 by @qbarthelemyAdd
ajd_methodparameter topyriemann.spatialfilters.CSP. #313 by @qbarthelemyAdd
pyriemann.geometry.distance.distance_poweuclid()andpyriemann.geometry.mean.mean_poweuclid()to use power Euclidean metric. #312 by @qbarthelemyEnhance
pyriemann.geometry.mean.mean_power(): addinitparameter and fix default initialization provided in the associated paper. #324 by @toncho11Add
pyriemann.geometry.distance.distance_chol(),pyriemann.geometry.geodesic.geodesic_logchol(),pyriemann.geometry.mean.mean_logchol(), and correctpyriemann.geometry.distance.distance_logchol(). #322 by @gabelstein
v0.6 (April 2024)¶
Update pyRiemann from Python 3.7 - 3.9 to 3.8 - 3.10. #254 by @qbarthelemy
Speedup pairwise distance function
pyriemann.geometry.distance.pairwise_distance()by adding individual functions for ‘euclid’, ‘harmonic’, ‘logeuclid’ and ‘riemann’ metrics. #256 by @gabelsteinAdd
pyriemann.geometry.test.is_real_type()to check the type of input arrays and addpyriemann.geometry.covariance.covariance_scm()allowing to process complex-valued inputs for ‘scm’ covariance estimator. #251 by @qbarthelemyUpdate to Read the Docs v2. #260 by @qbarthelemy
Correct
pyriemann.geometry.distance.distance_wasserstein()andpyriemann.geometry.distance.distance_kullback(), keeping only real part. #267 by @qbarthelemyDeprecate input
covmatsfor mean functions, renamed intoX. #252 by @qbarthelemyAdd support for complex covariance estimation for ‘lwf’, ‘mcd’, ‘oas’ and ‘sch’ estimators. #274 by @gabelstein
Deprecate input
covtestfor predict ofpyriemann.classification.KNearestNeighbor, renamed intoX. #259 by @qbarthelemyCorrect check for
kernel_fctparam ofpyriemann.classification.SVC. #272 by @qbarthelemyAdd
sample_weightparameter inTLCenter,TLStretchandTLRotate. #273 by @apmellotDeprecate
HankelCovariances, renamed intopyriemann.estimation.TimeDelayCovariances. #275 by @qbarthelemyAdd an example on augmented covariance matrix. #276 by @carraraig
Remove function
make_covariances. #280 by @qbarthelemySpeedup
pyriemann.estimation.TimeDelayCovariances. #281 by @qbarthelemyEnhance ajd module and add a generic
pyriemann.geometry.ajd.ajd()function. #238 by @qbarthelemyAdd
pyriemann.utils.viz.plot_bihist(),pyriemann.utils.viz.plot_biscatter()andpyriemann.utils.viz.plot_cov_ellipse()for display. #287 by @qbarthelemy and @gcattanAdd
pyriemann.estimation.CrossSpectra, and deprecateCospCovariancesrenamed intopyriemann.estimation.CoSpectra. #288 by @qbarthelemy
v0.5 (Jun 2023)¶
Fix
pyriemann.geometry.distance.pairwise_distance()for non-symmetric metrics. #229 by @qbarthelemyFix
mean_covarianceused with keyword arguments. #230 by @qbarthelemyAdd functions to test HPD and HPSD matrices,
pyriemann.geometry.test.is_herm_pos_def()andpyriemann.geometry.test.is_herm_pos_semi_def(). #231 by @qbarthelemyAdd function
pyriemann.datasets.make_matrices()to generate SPD, SPSD, HPD and HPSD matrices. Deprecate functionpyriemann.datasets.make_covariances. #232 by @qbarthelemyAdd tests for matrix operators and distances for HPD matrices, complete doc and add references. #234 by @qbarthelemy
Enhance tangent space module to process HPD matrices. #236 by @qbarthelemy
Fix regression introduced in
pyriemann.spatialfilters.Xdawn()by #214. #242 by @qbarthelemyFix
pyriemann.geometry.kernel.kernel_euclid()applied on non-symmetric matrices. #245 by @qbarthelemyAdd argument
squaredto all distances. #246 by @qbarthelemyCorrect transform and predict_proba of
pyriemann.classification.MeanField. #247 by @qbarthelemyEnhance mean module to process HPD matrices. #243 by @qbarthelemy
Correct
pyriemann.geometry.distance.distance_mahalanobis(), keeping only real part. #249 by @qbarthelemyFix
pyriemann.datasets.sample_gaussian_spd()used withsampling_method=rejectionon 2D matrices. #250 by @mhurte
v0.4 (Feb 2023)¶
Add exponential and logarithmic maps for three main metrics: ‘euclid’, ‘logeuclid’ and ‘riemann’.
pyriemann.geometry.tangentspace.tangent_space()is splitted in two steps: (i)log_map_*()projecting SPD matrices into tangent space depending on the metric; and (ii)pyriemann.geometry.tangentspace.upper()taking the upper triangular part of matrices. Similarly,pyriemann.geometry.tangentspace.untangent_space()is splitted into (i)pyriemann.geometry.tangentspace.unupper()and (ii)exp_map_*(). The different metrics for tangent space mapping can now be defined intopyriemann.tangentspace.TangentSpace, then used fortransform()as well as forinverse_transform(). #195 by @qbarthelemyEnhance AJD: add
inittopyriemann.geometry.ajd.ajd_pham()andpyriemann.geometry.ajd.rjd(), addwarm_restarttopyriemann.spatialfilters.AJDC. #196 by @qbarthelemyAdd parameter
sampling_methodtopyriemann.datasets.sample_gaussian_spd(), withrejectionaccelerating 2x2 matrices generation. #198 by @Artim436Add geometric medians for Euclidean and Riemannian metrics:
pyriemann.geometry.median_euclid(), andpyriemann.geometry.median_riemann(), and add an example in gallery to compare means and medians on synthetic datasets. #200 by @qbarthelemyAdd
score()topyriemann.regression.KNearestNeighborRegressor. #205 by @qbarthelemyAdd Transfer Learning module and examples, including RPA and MDWM. #189 by @plcrodrigues, @qbarthelemy and @sylvchev
Add class distinctiveness function to measure the distinctiveness between classes on the manifold,
pyriemann.classification.class_distinctiveness(), and complete an example in gallery to show how it works on synthetic datasets. #215 by @MSYamamotoAdd example on ensemble learning applied to functional connectivity, and add
pyriemann.geometry.base.nearest_sym_pos_def(). #202 by @mccorsi and @sylvchevAdd kernel matrices representation
pyriemann.estimation.Kernelsand complete example comparing estimators. #217 by @qbarthelemyAdd a new covariance estimator, robust fixed point covariance, and add kwds arguments for all covariance based functions and classes. #220 by @qbarthelemy
Add example in gallery on frequency band selection using class distinctiveness measure. #219 by @MSYamamoto
Add
pyriemann.geometry.covariance.covariance_mest()supporting three robust M-estimators (Huber, Student-t and Tyler) and available for all covariance based functions and classes; and add an example on robust covariance estimation for corrupted data. Add alsopyriemann.geometry.distance.distance_mahalanobis()between between vectors and a Gaussian distribution. #223 by @qbarthelemy
v0.3 (July 2022)¶
Correct spectral estimation in
pyriemann.geometry.covariance.cross_spectrum()to obtain equivalence with SciPy. #131 by @qbarthelemyAdd instantaneous, lagged and imaginary coherences in
pyriemann.geometry.covariance.coherence(), andpyriemann.estimation.Coherences. #132 by @qbarthelemyAdd
partial_fitinpyriemann.clustering.Potato, useful for an online update; and update example on artifact detection. #133 by @qbarthelemyDeprecate
pyriemann.utils.viz.plot_confusion_matrixas sklearn integrate its own version. #135 by @sylvchevAdd Ando-Li-Mathias (ALM) mean in
pyriemann.geometry.mean.mean_alm(). #56 by @sylvchevAdd Schaefer-Strimmer covariance estimator in
pyriemann.geometry.covariance.covariances(), and an example to compare estimators. #59 by @sylvchevRefactor tests + fix refit of
pyriemann.tangentspace.TangentSpace. #136 by @sylvchevAdd
pyriemann.clustering.PotatoField, and an example on artifact detection. #142 by @qbarthelemyAdd sampling SPD matrices from a Riemannian Gaussian distribution in
pyriemann.datasets.sample_gaussian_spd(). #140 by @plcrodriguesAdd new function
pyriemann.datasets.make_gaussian_blobs()for generating random datasets with SPD matrices. #140 by @plcrodriguesAdd module
pyriemann.utils.vizin API, addpyriemann.utils.viz.plot_waveforms(), and add an example on ERP visualization. #144 by @qbarthelemyAdd a special form covariance matrix
pyriemann.geometry.covariance.covariances_X(). #147 by @qbarthelemyAdd masked and NaN means with Riemannian metric:
pyriemann.geometry.mean.maskedmean_riemann()andpyriemann.geometry.mean.nanmean_riemann(). #149 by @qbarthelemy and @sylvchevAdd
corroption inpyriemann.geometry.covariance.normalize(), to normalize covariance into correlation matrices. #153 by @qbarthelemyAdd block covariance matrix:
pyriemann.estimation.BlockCovariancesandpyriemann.geometry.covariance.block_covariances(). #154 by @gabelsteinAdd Riemannian Locally Linear Embedding:
pyriemann.embedding.LocallyLinearEmbeddingandpyriemann.embedding.locally_linear_embedding(). #159 by @gabelsteinAdd Riemannian Kernel Function:
pyriemann.geometry.kernel.kernel_riemann(). #159 by @gabelsteinFix
fitinpyriemann.channelselection.ElectrodeSelection. #166 by @qbarthelemyAdd power mean estimation in
pyriemann.geometry.mean.mean_power(). #170 by @qbarthelemy and @plcrodriguesAdd example in gallery to compare classifiers on synthetic datasets. #175 by @qbarthelemy
Add
predict_probainpyriemann.classification.KNearestNeighbor, and correct attributeclasses_. #171 by @qbarthelemyAdd Riemannian Support Vector Machine classifier:
pyriemann.classification.SVC. #175 by @gabelstein and @qbarthelemyAdd Riemannian Support Vector Machine regressor:
pyriemann.regression.SVR. #175 by @gabelstein and @qbarthelemyAdd K-Nearest-Neighbor regressor:
pyriemann.regression.KNearestNeighborRegressor. #164 by @gabelstein, @qbarthelemy and @agramfortAdd Minimum Distance to Mean Field classifier:
pyriemann.classification.MeanField. #172 by @qbarthelemy and @plcrodriguesAdd example on principal geodesic analysis (PGA) for SSVEP classification. #169 by @qbarthelemy
Add
pyriemann.geometry.distance.distance_harmonic(), and sort functions by their names in code, doc and tests. #183 by @qbarthelemyParallelize functions for dataset generation:
pyriemann.datasets.make_gaussian_blobs(). #179 by @sylvchevFix dispersion when generating datasets:
pyriemann.datasets.sample_gaussian_spd(). #179 by @sylvchevEnhance base and distance functions, to process ndarrays of SPD matrices. #186 and #187 by @qbarthelemy
Enhance utils functions, to process ndarrays of SPD matrices. #190 by @qbarthelemy
Enhance means functions, with faster implementations and warning when convergence is not reached. #188 by @qbarthelemy
v0.2.7 (June 2021)¶
Fix compatibility with scikit-learn v0.24
Correct probas of
pyriemann.classification.MDM. #100 by @qbarthelemyAdd
predict_probaforpyriemann.clustering.Potato, and an example on artifact detection. #105 by @qbarthelemyAdd a normalization function for covariance matrices,
pyriemann.geometry.covariance.normalize(). #111 by @qbarthelemyAdd weights to Pham’s AJD algorithm
pyriemann.geometry.ajd.ajd_pham(). #112 by @qbarthelemyAdd
pyriemann.geometry.covariance.cross_spectrum(), fixpyriemann.geometry.covariance.cospectrum();pyriemann.geometry.covariance.coherence()output is kept unchanged. #118 by @qbarthelemyAdd a function to compute non-diagonality weights of matrices,
pyriemann.geometry.covariance.get_nondiag_weight(). #119 by @qbarthelemyAdd
pyriemann.spatialfilters.AJDCfor BSS and gBSS, with an example on artifact correction. #120 by @qbarthelemyAdd
pyriemann.preprocessing.Whitening, with optional dimension reduction. #122 by @qbarthelemy
v0.2.6 (March 2020)¶
Remove support for Python 2, and update code for better scikit-learn v0.22 support. #79 by @alexandrebarachant
v0.2.5 (January 2018)¶
Add
BilinearFilter.Add a permutation test for generic scikit-learn estimator.
Enhance stats module, with distance based t-test and f-test.
Remove two way permutation test.
Add support for Python 3.5 in travis.
Add
Shrinkagetransformer. #38 by @alexandrebarachantAdd
Coherencestransformer.Add
Embeddingclass andpyriemann.geometry.distance.pairwise_distance(). #54 by @plcrodrigues
v0.2.4 (June 2016)¶
Improve documentation.
Add
TSclassifierfor out-of the box tangent space classification.Add Wasserstein distance and mean.
Add
KNearestNeighborclassifier.Add softmax probabilities for
MDM.Add
CSPfor covariance matrices.Add approximate joint diagonalization algorithms: JADE, PHAM, UWEDGE.
Add ALE mean.
Add multiclass
CSP.Correct param name in
CospCovariancesto comply to scikit-learn.Correct attributes name in most modules to comply to the scikit-learn naming convention.
Add
HankelCovariancesestimation.Add
SPoCspatial filtering.Add harmonic mean.
Add Kullback-Leibler mean.
v0.2.3 (November 2015)¶
Add multiprocessing for
MDMwith joblib.Add Kullback-Leibler divergence.
Add Riemannian
Potato.Add sample_weight for mean estimation and
MDM.
v0.2.2 (June 2015)¶
Add possibility to use a dictionary to define metrics used for
MDM.Add
svdargument inERPCovariances.
v0.1 (April 2015)¶
Add
MDMand firstutils(distance, mean, geodesic, covariance).Add
FgMDM,TangentSpace,FGDA.Add
ElectrodeSelection,Covariances,ERPCovariances,XdawnCovariances,Xdawn.Add examples for motor imagery ad ERP.