You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Dataset.broadcast_like(other) should broadcast against like variables in other #6549
I am a bit puzzled about how xarrays is broadcasting Datasets.
It seems to always add all dimensions to all variables.
Is this what you want in general?
See this example:
importxarrayasxrda=xr.DataArray([[1, 2, 3]], dims=("x", "y"))
# <xarray.DataArray (x: 1, y: 3)># array([[1, 2, 3]])ds=xr.Dataset({"a": ("x", [1]), "b": ("z", [2, 3])})
# <xarray.Dataset># Dimensions: (x: 1, z: 2)# Dimensions without coordinates: x, z# Data variables:# a (x) int32 1# b (z) int32 2 3ds.broadcast_like(da)
# returns:# <xarray.Dataset># Dimensions: (x: 1, y: 3, z: 2)# Dimensions without coordinates: x, y, z# Data variables:# a (x, y, z) int32 1 1 1 1 1 1# b (x, y, z) int32 2 3 2 3 2 3# I think it should return:# <xarray.Dataset># Dimensions: (x: 1, y: 3, z: 2)# Dimensions without coordinates: x, y, z# Data variables:# a (x, y) int32 1 1 1 # notice here without "z" dim# b (x, y, z) int32 2 3 2 3 2 3
Describe the solution you'd like
I would like broadcasting to behave the same way as e.g. a simple addition.
In the upper example da + ds produces the dimensions that I want.
Describe alternatives you've considered
ds + xr.zeros_like(da) this works, but seems more like a "dirty hack".
Additional context
Maybe one can add an option to broadcasting that controls this behavior?
I tried adding a join input to Dataset.broadcast_like and passing it to align, but that did not work (at least for join="inner"). Still got the same result...
changed the title [-]Add a broadcasting mode that inserts size-1 labeled dimensions[/-][+]Add a broadcasting mode that inserts size-1 unlabeled dimension[/+]on Feb 6, 2025
IIUC the request is to avoid broadcasting the variables in ds against each other, and to only broadcast each variable against da separately. Did I get it right?
changed the title [-]Improved Dataset.broadcasting[/-][+]`Dataset.broadcast_like(other)` should broadcast against like variables in other[/+]on Feb 6, 2025
I had to summarize the overall problem, it's that behaviour of xarray.broadcast (and Dataset.broadcast_like etc) is not consistent with how actual arithmetic operations broadcast, in cases where Datasets are involved.
Activity
keewis commentedon Apr 30, 2022
see also #6304 which covers
xr.broadcastheadtr1ck commentedon Apr 30, 2022
I tried adding a
joininput toDataset.broadcast_likeand passing it toalign, but that did not work (at least forjoin="inner"). Still got the same result...headtr1ck commentedon May 1, 2022
related to #6227
[-]Improved Dataset broadcasting[/-][+]Add a broadcasting mode that inserts size-1 labeled dimensions[/+][-]Add a broadcasting mode that inserts size-1 labeled dimensions[/-][+]Add a broadcasting mode that inserts size-1 unlabeled dimension[/+][-]Add a broadcasting mode that inserts size-1 unlabeled dimension[/-][+]Improved Dataset.broadcasting[/+]dcherian commentedon Feb 6, 2025
I keep misunderstanding this issue so typing this out to make sure I got it right.
Writing out dimension names in square brackets
IIUC the request is to avoid broadcasting the variables in
dsagainst each other, and to only broadcast each variable againstdaseparately. Did I get it right?[-]Improved Dataset.broadcasting[/-][+]`Dataset.broadcast_like(other)` should broadcast against like variables in other[/+]dcherian commentedon Feb 6, 2025
@mjwillson posted a nice summary in #10031 :
alvarosg commentedon Feb 6, 2025
In the light of #10031, and broadcasting a dataset to itself not behaving as a no-op, should we label this as "bug" rather than "enhancement"?
headtr1ck commentedon Oct 27, 2025
I found a use-case for broadcasting a dataset like requested: When trying to change values in-place, this only works if the replacement values are already broadcasted.
An example can be found here: https://github.com/pydata/xarray/blob/main/xarray/computation/computation.py#L842 where instead of broadcasting I had to resort to adding a zero-valued dataset.