diff --git a/Changelog.rst b/Changelog.rst index 8129242891..c82e9a02bb 100644 --- a/Changelog.rst +++ b/Changelog.rst @@ -5,6 +5,9 @@ Version NEXTVERSION * Fix bug in `cf.read` that prevented some OPeNDAP URLS being read (https://github.com/NCAS-CMS/cf-python/issues/948) +* Fix bug that caused weighted `cf.collapse` and `cf.weights` to fail + when a cell meausures has a size 1 axis + (https://github.com/NCAS-CMS/cf-python/issues/952) ---- diff --git a/MANIFEST.in b/MANIFEST.in index b8412ba8ca..6b545ff796 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,7 +9,7 @@ recursive-exclude cf/data *.rst prune cf/test recursive-include cf/test __init__.py test_*.py recursive-include cf/test cfa_test.sh run_tests.py setup_create_field.py create_test_files*.py individual_tests.sh -recursive-include cf/test test_file.nc test_file[2-4].nc file.nc file[1-9].nc ugrid_global_1.nc ugrid_global_2.nc create_test_files.npz create_test_files_2.npz wgdos_packed.pp extra_data.pp file1.pp *.cdl create_test_files.npz create_test_files_2.npz example_field_0.nc +recursive-include cf/test test_file.nc test_file[2-4].nc file.nc file[1-9].nc ugrid_global_1.nc ugrid_global_2.nc create_test_files.npz create_test_files_2.npz wgdos_packed.pp extra_data.pp file1.pp *.cdl create_test_files.npz create_test_files_2.npz example_field_0.nc cell_measures.nc recursive-include cf/test/example_field_0.zarr[23] * include cf/test/example_field_0.kerchunk prune cf/test/dir diff --git a/cf/test/cell_measures.nc b/cf/test/cell_measures.nc new file mode 100644 index 0000000000..52ca079dc7 Binary files /dev/null and b/cf/test/cell_measures.nc differ diff --git a/cf/test/test_collapse.py b/cf/test/test_collapse.py index b3f73f4524..a57ca68879 100644 --- a/cf/test/test_collapse.py +++ b/cf/test/test_collapse.py @@ -37,6 +37,9 @@ def setUp(self): self.filename2 = os.path.join( os.path.dirname(os.path.abspath(__file__)), "test_file2.nc" ) + self.cell_measures = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "cell_measures.nc" + ) def test_Field_collapse_CLIMATOLOGICAL_TIME(self): verbose = False @@ -853,6 +856,31 @@ def test_Field_collapse_HEALPix(self): g1.coordinate_reference("grid_mapping_name:latitude_longitude") ) + def test_Field_cell_measures(self): + """Test collapse weights by area and volume cell measures.""" + f = cf.read(self.cell_measures)[0] + self.assertEqual(f.shape, (1, 5, 5, 5)) + self.assertEqual(f.cell_measure("measure:area").shape, (5, 5)) + self.assertEqual(f.cell_measure("measure:volume").shape, (1, 5, 5, 5)) + + f.collapse("area: mean", weights="area") + f.collapse("volume: mean", weights="volume") + + self.assertEqual(f.weights("area").shape, (5, 5)) + self.assertEqual(f.weights("volume").shape, (5, 5, 5)) + + g = f[..., 0] + + self.assertEqual(g.shape, (1, 5, 5, 1)) + self.assertEqual(g.cell_measure("measure:area").shape, (5, 1)) + self.assertEqual(g.cell_measure("measure:volume").shape, (1, 5, 5, 1)) + + g.collapse("area: mean", weights="area") + g.collapse("volume: mean", weights="volume") + + self.assertEqual(g.weights("area").shape, (5,)) + self.assertEqual(g.weights("volume").shape, (5, 5)) + if __name__ == "__main__": print("Run date:", datetime.datetime.now()) diff --git a/cf/weights.py b/cf/weights.py index 3cefd163d3..f9e893cbf0 100644 --- a/cf/weights.py +++ b/cf/weights.py @@ -1548,9 +1548,9 @@ def cell_measure( ) clm = clm.get_data(_fill_value=False).copy() - if clm_axes != clm_axes0: - iaxes = [clm_axes0.index(axis) for axis in clm_axes] - clm.squeeze(iaxes, inplace=True) + + # Squeeze out size 1 axes + clm.squeeze(inplace=True) if methods: weights[tuple(clm_axes)] = measure + " cell measure"