v3.20.0
v3.20.0 (2026-02-15)
✨ Features
-
manager: add reusable
watchAPI and deprecate low-level watch transports (#273) (f0f5567)Introduces a thread-safe, module-level watcher API (
watch,watched_variables,maybe_push,shutdown) that works both with and without the IPython extension (including non-IPython notebook environments like marimo). Refactors%watchand extension load/unload to delegate to this shared API, keeping IPython behavior consistent while adding a polling fallback when post-cell hooks are unavailable.This does not affect behavior for existing users of
%watchin IPython notebooks, but enables new use cases for programmatic data watching in other contexts. -
ftool: export fit parameters (values and stderr) to HDF5 or ImageTool from the right-click menu of the parameter plot (#270) (0d76dbb)
-
imagetool: support non-uniform non-display axes in multicursor plot code (#268) (8392e9f)
Generate valid matplotlib code for multicursor selections when non-display axes are non-uniform by using mixed selection (
iselfor non-uniform axes,qselfor uniform axes) and correctly averaging binned non-uniform selections. -
ftool: improve parameter merging when changing model parameters (#264) (e70e0e9)
Changing model parameters now merges parameters more intelligently. Parameters that exist in both the old and new models are retained with their current values. Also, expressions are transferred if they can be evaluated with the new model's parameters; otherwise the computed value and bounds are
copied instead.
-
ftool: add overlay plot (#263) (764379a)
Adds a parameter overlay checkbox next to the parameter selector for 2D fits that plots the selected parameter on the 2D image.
-
analysis.fit: add a Shirley background option to
MultiPeakModel(#258) (edcecb5)MultiPeakModelnow supports a Shirley background.This also changes
MultiPeakModel.eval_componentsto return several named background components instead of a single_bkgentry. This may require changes to user code that references the background.
🐞 Bug Fixes
-
restool: ensure fit results are computed inside the thread for dask-backed inputs (60786ae)
-
ftool: fix thread lifetime handling and possible deadlock on very fast fits (7fe75fb)
-
restool: resolved threading issues related to canceling fits and closing window while fit is running (aedf5da)
-
imagetool: suppress duplicate UI alerts for exceptions and warnings (#271) (68c2893)
This fixes an issue where multiple alert dialogs would appear for the same error condition when creating ImageTool windows or loading workspaces, leading to a hang on Windows.
-
imagetool: allow out-of-bounds center values in RotationDialog (e677e58)
Center coordinates are no longer clamped to the current data bounds. This lets users rotate around arbitrary points (including outside the visible coordinate range).
-
imagetool: improve server shutdown handling and timeout management (f8135cd)
-
analysis.image: make
boxcar_filtercompatible with dask arrays (ea80731) -
analysis: enforce coordinate validity in filters and correlation (c699574)
Tighten coordinate handling in gaussian filters and autocorrelation, and raises on invalid/degenerate spacing. This prevents divide-by-zero issues and makes errors explicit for constant coordinates.
-
imagetool: correct formatting of error traceback (8b90db8)
-
analysis: correctly handle dimensions of size 1 across various functions (67875c6)
-
dtool: handle data with dimensions of size 1 (5d53894)
-
interactive.utils: improve cut tolerance (histogram) handling for scalar and iterable inputs (e5e159f)
-
interactive.utils: handle singleton dimensions in
array_rect(5ea9163) -
imagetool: avoid false non-uniform axes for user _idx dims (42f073e)
Refine ImageTool so that non-uniform axis detection so only dims created by
make_dims_uniformare treated as non-uniform. This prevents accidental misclassification when users provide their own*_idxdimensions. -
interactive: ensure spinbox value updates and validation checks are accurate (0c4e67e)
-
qsel.average: average over all dimensions when no dimension is specified (54d460b)
DataArray.qsel.average()now averages over all dimensions whendim=Noneis passed to match the behavior ofDataArray.mean(). -
imagetool: average coordinates when binning over non-uniform axes (bce5a66)
When binning over non-uniform axes, coordinates associated to the non-uniform dimension were dropped instead of being
averaged. This commit fixes that by using
qsel.average()to average the coordinates along the binned dimensions. -
qsel: drop non-numeric coordinates silently when averaging instead of raising an error (26b4b29)
⚡️ Performance
-
imagetool: micro-optimization for restoring single cursor state (09619f3)
-
itool: avoid unnecessary deep-copying of data (4ef1bd2)
-
manager: speed up closing multiple ImageTool windows (#272) (4c334a5)
-
ktool: ensure updates are smooth under rapid input parameter changes (#267) (133205e)
-
analysis.transform: disable parallel interpolation in
shiftwith order 1 and add some parameters for further optimization (b53e89f)Uses serial interpolation in
shiftfor compatibility with workflows that utilize multiprocessing, like dask. Also adds new parameterskeep_dim_orderandassume_sortedwhich further optimizes the graph for dask-based workflows. -
ftool: cache y values for 2D data (e2c4611)
-
analysis.correlation: micro-optimization to use shallow copy (d5a88b7)
-
imagetool: micro-optimize shallow copy when updating data (5e7d4fe)
-
interactive: defer ImageTool UI updates (#262) (e2ad0e8)
ImageTool now lazy-populates colormap and control UI to reduce startup time, and avoids auto-showing windows when loading multiple DataArrays at once. The window contents are now computed on demand.
♻️ Code Refactor
-
manager: change console toggle shortcut to
Ctrl+J(9ebb92f) -
ftool: ask for confirmation before transposing data (580c933)
[main 6d0e364] bump: version 3.19.2 → 3.20.0
3 files changed, 3 insertions(+), 3 deletions(-)