v3.4 (01 Dec 2022)#
This document explains the changes made to Iris for this release (View all changes.)
v3.4.0 Release Highlights
The highlights for this minor release of Iris include:
We have archived older Iris documentation - everything before
v3.0.0- so older versions will soon no longer appear in search engines. If you need this older documentation: please see Support.We have added a Glossary to the Iris documentation.
We have completed work to make Pandas interoperability handle n-dimensional
Cubes.We have begun refactoring Iris’ regridding, which has already improved performance and functionality, with more potential in future!
We have made several other significant 🚀 Performance Enhancements.
And finally, get in touch with us on GitHub if you have any issues or feature requests for improving Iris. Enjoy!
v3.4.1 (21 Feb 2023)#
v3.4.1 Patches
The patches in this release of Iris include:
@trexfeathers and @pp-mo made Iris’ use of the netCDF4 library thread-safe. (PR #5095)
@trexfeathers and @pp-mo removed the netCDF4 pin mentioned in 🔗 Dependencies point 3. (PR #5095)
📢 Announcements#
Welcome to @ESadek-MO, @TTV-Intrepid and @hsteptoe, who made their first contributions to Iris 🎉
Do you enjoy python-stratify? Did you know that Iris includes a convenience for using python-stratify with
Cubes? It has been ‘experimental’ for several years now, without receiving much feedback, so it’s use it or lose it time: please try outiris.experimental.stratifyand let us know what you think!
✨ Features#
@ESadek-MO edited
expand_filespecs()to allow expansion of non-existing paths, and added expansion functionality tosave(). (Issue #4772, PR #4913)@trexfeathers and Julian Heming added new mappings between CF standard names and UK Met Office LBFC codes. (PR #4859)
@pp-mo changed the metadata of a face/edge-type
MeshCoord, to be same as the face/edge coordinate in the mesh from which it takes its.points. Previously, all MeshCoords took their metadata from the node coord, but only a node-type MeshCoord now does that. Also, the MeshCoord.var_nameis now that of the underlying coord, whereas previously this was always None. These changes make MeshCoord more like an ordinaryAuxCoord, which avoids some specific known usage problems. (Issue #4860, PR #5020)@Esadek-MO and @trexfeathers added dim coord prioritisation to
_get_lon_lat_coords()iniris.analysis.cartography. This allowsiris.analysis.cartography.area_weights()andproject()to handle cubes which contain both dim and aux coords of the same type e.g.longitudeandgrid_longitude. (Issue #3916, PR #5029).@stephenworsley added the ability to regrid derived coordinates with the
PointInCellregridding scheme. (PR #4807)@trexfeathers made NetCDF loading more tolerant by enabling skipping of
DimCoords,AuxCoords,CellMeasures andAncillaryVariables if they cannot be added to aCube(e.g. due to CF non-compliance). This is done via a new error class:CannotAddError(subclass ofValueError). (PR #5054)@pp-mo implemented == and != comparisons for
Constraints. A simple constraint is now == to another one constructed in the same way. However, equality is limited for more complex cases : value-matching functions must be the same identical function, and for &-combinations order is significant, i.e.(c1 & c2) != (c2 & c1). (Issue #3616, PR #3749).@hsteptoe and @trexfeathers improved
iris.pandas.as_data_frame()'s conversion ofCubes toDataFrames. This includes better handling of multipleCubedimensions, auxiliary coordinates and attribute information. Note: the improvements are opt-in, by setting theiris.FUTURE.pandas_ndimflag (seeiris.Futurefor more). (Issue #4526, PR #4909, PR #4669, PR #5059, PR #5074)
🐛 Bugs Fixed#
@rcomer and @pp-mo (reviewer) factored masking into the returned sum-of-weights calculation from
SUM. (PR #4905)@schlunma fixed a bug which prevented using
iris.cube.Cube.collapsed()on coordinates whose number of bounds differs from 0 or 2. This enables the use of this method on mesh coordinates. (Issue #4672, PR #4870)@bjlittle and @lbdreyer (reviewer) fixed the building of the CF Standard Names module
iris.std_namesfor thesetup.pycommandsdevelopandstd_names. (Issue #4951, PR #4952)@lbdreyer and @pp-mo (reviewer) fixed the cube print out such that scalar ancillary variables are displayed in a dedicated section rather than being added to the vector ancillary variables section. Further, ancillary variables and cell measures that map to a cube dimension of length 1 are now included in the respective vector sections. (PR #4945)
@rcomer removed some old redundant code that prevented determining the order of time cells. (Issue #4697, PR #4729)
@stephenworsley improved the accuracy of the error messages for
coord()when failing to find coordinates in the case where a coordinate is given as the argument. Similarly, improved the error messages forcell_measure()andancillary_variable(). (Issue #4898, PR #4928)@stephenworsley fixed a bug which caused derived coordinates to be realised after calling
iris.cube.Cube.aggregated_by(). (Issue #3637, PR #4947)@rcomer corrected the
standard_namemapping from UM stash codem01s30i311to indicate that this is the upward, rather than northward part of the flow. (PR #5060)@bjlittle and @trexfeathers (reviewer) fixed an issue which prevented uncompressed PP fields with additional trailing padded words in the field data to be loaded and saved. (PR #5058)
@lbdreyer and @trexfeathers (reviewer) fixed the handling of data when regridding with
UnstructuredNearestor callinginterpolate()such that the data type and mask is preserved. (Issue #4463, PR #5062)
💣 Incompatible Changes#
@trexfeathers altered testing to accept new Dask copying behaviour from dask/dask#9555 - copies of a Dask array created using
da.from_array()will allcompute()to a shared identical array. So creating aCubeusingCube(data=da.from_array(..., then usingCubecopy(), will produce twoCubes that both return an identical array when requestingCubedata. We do not expect this to affect typical user workflows but please get in touch if you need help. (PR #5041)@trexfeathers moved
iris.experimental.animate.animate()toiris.plot.animate(), in recognition of its successful use over several years since introduction. (PR #5056)
🚀 Performance Enhancements#
@rcomer and @pp-mo (reviewer) increased aggregation speed for
SUM,COUNTandPROPORTIONon real data. (PR #4905)@bouweandela made
iris.coords.Coord.cells()faster for time coordinates. This also affectsiris.cube.Cube.extract(),iris.cube.Cube.subset(), andiris.coords.Coord.intersect(). (PR #4969)@bouweandela improved the speed of
iris.cube.Cube.subset()/iris.coords.Coord.intersect(). (PR #4955)@stephenworsley improved the speed of the
PointInCellregridding scheme. (PR #4807)
🔥 Deprecations#
@hsteptoe and @trexfeathers (reviewer) deprecated
iris.pandas.as_series()in favour of the newiris.pandas.as_data_frame()- see ✨ Features for more details. (PR #4669)
🔗 Dependencies#
@rcomer introduced the
dask >=2.26minimum pin, so that Iris can benefit from Dask’s support for NEP13 and NEP18. (PR #4905)@trexfeathers advanced the Cartopy pin to
>=0.21, as Cartopy’s change to default Transverse Mercator projection affects an Iris test. See SciTools/cartopy@fcb784d and SciTools/cartopy@8860a81 for more details. (PR #4968)@trexfeathers introduced the
netcdf4<1.6.1pin to avoid a problem with segfaults. (PR #4968, PR #5075, Issue #5016)@trexfeathers updated the Matplotlib colormap registration in
iris.palettein response to a deprecation warning. Using the new Matplotlib API also means amatplotlib>=3.5pin. (PR #4998)See 💣 Incompatible Changes for notes about dask/dask#9555.
📚 Documentation#
@ESadek-MO, @TTV-Intrepid and @trexfeathers added a gallery example for zonal means plotted parallel to a cartographic plot. (PR #4871)
@Esadek-MO added a key-terms Glossary page into the user guide. (PR #4902)
@pp-mo added a code example for converting ORCA-gridded data to an unstructured cube. (PR #5013)
@Esadek-MO added links to relevant Gallery examples within the User Guide to improve understanding. (PR #5009)
@trexfeathers changed the warning header for the latest documentation to reference Read the Docs’ built-in version switcher, instead of generating its own independent links. (PR #5055)
@tkknight updated the links for the Iris documentation to v2.4 and earlier to point to the archive of zip files instead. (PR #5064)
@Esadek-MO began adding notes at the bottom of functions to to clarify if the function preserves laziness or not. See Issue #3292 for the ongoing checklist. (PR #5066)
💼 Internal#
@rcomer removed the obsolete
setUpClassmethod from Iris testing. (PR #4927)@bjlittle and @lbdreyer (reviewer) removed support for
python setup.py test, which is a deprecated approach to executing package tests, see pypa/setuptools#1684. Also performed assortedsetup.pyscript hygiene. (PR #4948, PR #4949, PR #4950)@pp-mo split the module
iris.fileformats.netcdfinto separateloaderandsaversubmodules, just to make the code easier to handle.@trexfeathers adapted the benchmark for importing
iris.paletteto cope with new colormap behaviour in Matplotlib v3.6. (PR #4998)@rcomer removed a now redundant workaround for an old matplotlib bug, highlighted by Issue #4090. (PR #4999)
@rcomer added the
showoption to the documentation Makefiles, as a convenient way for contributors to view their built documentation. (PR #5000)