From 2c50168d10ba35750a8e3c3e942e8d89359a312a Mon Sep 17 00:00:00 2001 From: Jasper Date: Thu, 27 Feb 2025 15:58:14 +0100 Subject: [PATCH 1/5] force attributes on output coords --- xarray/core/computation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xarray/core/computation.py b/xarray/core/computation.py index 29de030ac5f..761455caa36 100644 --- a/xarray/core/computation.py +++ b/xarray/core/computation.py @@ -306,7 +306,7 @@ def apply_dataarray_vfunc( first_obj = _first_of_type(args, DataArray) name = first_obj.name result_coords, result_indexes = build_output_coords_and_indexes( - args, signature, exclude_dims, combine_attrs=keep_attrs + args, signature, exclude_dims, combine_attrs="no_conflicts" ) data_vars = [getattr(a, "variable", a) for a in args] @@ -522,7 +522,7 @@ def apply_dataset_vfunc( ) list_of_coords, list_of_indexes = build_output_coords_and_indexes( - args, signature, exclude_dims, combine_attrs=keep_attrs + args, signature, exclude_dims, combine_attrs="no_conflicts" ) args = tuple(getattr(arg, "data_vars", arg) for arg in args) From 2b75ea4c1679c1358f58c4d06697efeaff8ee214 Mon Sep 17 00:00:00 2001 From: Jasper Date: Thu, 27 Feb 2025 17:07:15 +0100 Subject: [PATCH 2/5] force attributes using drop_conflicts instead of no_conflicts --- xarray/core/computation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xarray/core/computation.py b/xarray/core/computation.py index 761455caa36..67c95bf8b84 100644 --- a/xarray/core/computation.py +++ b/xarray/core/computation.py @@ -306,7 +306,7 @@ def apply_dataarray_vfunc( first_obj = _first_of_type(args, DataArray) name = first_obj.name result_coords, result_indexes = build_output_coords_and_indexes( - args, signature, exclude_dims, combine_attrs="no_conflicts" + args, signature, exclude_dims, combine_attrs="drop_conflicts" ) data_vars = [getattr(a, "variable", a) for a in args] @@ -522,7 +522,7 @@ def apply_dataset_vfunc( ) list_of_coords, list_of_indexes = build_output_coords_and_indexes( - args, signature, exclude_dims, combine_attrs="no_conflicts" + args, signature, exclude_dims, combine_attrs="drop_conflicts" ) args = tuple(getattr(arg, "data_vars", arg) for arg in args) From ca81bf74e899010088cafa32b37f1c9120fe1303 Mon Sep 17 00:00:00 2001 From: Jasper Date: Thu, 27 Feb 2025 17:08:57 +0100 Subject: [PATCH 3/5] add test_keep_coordattrs --- xarray/tests/test_computation.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xarray/tests/test_computation.py b/xarray/tests/test_computation.py index 1d80d874df0..864b65ff6b7 100644 --- a/xarray/tests/test_computation.py +++ b/xarray/tests/test_computation.py @@ -691,6 +691,12 @@ def test_broadcast_compat_data_2d() -> None: ) +def test_keep_coordattrs() -> None: + a = xr.DataArray([0, 1], [("x", [0, 1], {"a": "b"})]) + actual = apply_ufunc(operator.abs, a) + assert actual.x.attrs == a.x.attrs + + def test_keep_attrs() -> None: def add(a, b, keep_attrs): if keep_attrs: From ca7db649e5de035e6ad222996f888abea49426fa Mon Sep 17 00:00:00 2001 From: Jasper Date: Thu, 27 Feb 2025 19:36:53 +0100 Subject: [PATCH 4/5] Revert "force attributes using drop_conflicts instead of no_conflicts" This reverts commit 2b75ea4c1679c1358f58c4d06697efeaff8ee214. --- xarray/core/computation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xarray/core/computation.py b/xarray/core/computation.py index 67c95bf8b84..761455caa36 100644 --- a/xarray/core/computation.py +++ b/xarray/core/computation.py @@ -306,7 +306,7 @@ def apply_dataarray_vfunc( first_obj = _first_of_type(args, DataArray) name = first_obj.name result_coords, result_indexes = build_output_coords_and_indexes( - args, signature, exclude_dims, combine_attrs="drop_conflicts" + args, signature, exclude_dims, combine_attrs="no_conflicts" ) data_vars = [getattr(a, "variable", a) for a in args] @@ -522,7 +522,7 @@ def apply_dataset_vfunc( ) list_of_coords, list_of_indexes = build_output_coords_and_indexes( - args, signature, exclude_dims, combine_attrs="drop_conflicts" + args, signature, exclude_dims, combine_attrs="no_conflicts" ) args = tuple(getattr(arg, "data_vars", arg) for arg in args) From 5afeb7cd0cc6371a990ce8dc046d4f90a75e6b08 Mon Sep 17 00:00:00 2001 From: Jasper Date: Thu, 27 Feb 2025 19:56:41 +0100 Subject: [PATCH 5/5] add missing coordinate atributes fix to doc --- doc/whats-new.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/whats-new.rst b/doc/whats-new.rst index a10a8c8851f..b35ec7b11db 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -57,7 +57,8 @@ Bug fixes Haacker `_. - Fix ``isel`` for multi-coordinate Xarray indexes (:issue:`10063`, :pull:`10066`). By `Benoit Bovy `_. - +- Always merge coordinates with "no_conflicts" to fix missing attributes after apply_ufunc + operations (:issue:`9317`). By `Jasper de Jong `_. Documentation ~~~~~~~~~~~~~