Skip to content

Commit 889a2d6

Browse files
committed
Add broadcast_like.
Closes pydata#2885
1 parent 9c0fb6c commit 889a2d6

File tree

6 files changed

+60
-2
lines changed

6 files changed

+60
-2
lines changed

doc/api.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ Reshaping and reorganizing
212212
Dataset.shift
213213
Dataset.roll
214214
Dataset.sortby
215+
Dataset.broadcast_like
215216

216217
DataArray
217218
=========
@@ -386,6 +387,7 @@ Reshaping and reorganizing
386387
DataArray.shift
387388
DataArray.roll
388389
DataArray.sortby
390+
DataArray.broadcast_like
389391

390392
.. _api.ufuncs:
391393

doc/whats-new.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ New functions/methods
2323

2424
- New methods for reshaping Datasets of variables with different dimensions
2525
(:issue:`1317`). By `Noah Brenowitz <https://github.com/nbren12>`_.
26+
- Added :py:meth:`DataArray.broadcast_like` and :py:meth:`Dataset.broadcast_like`.
27+
By `Deepak Cherian <https://github.com/dcherian>`_.
2628

2729
Enhancements
2830
~~~~~~~~~~~~

xarray/core/dataarray.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
computation, dtypes, groupby, indexing, ops, resample, rolling, utils)
1414
from .accessor_dt import DatetimeAccessor
1515
from .accessor_str import StringAccessor
16-
from .alignment import align, reindex_like_indexers
16+
from .alignment import align, broadcast, reindex_like_indexers
1717
from .common import AbstractArray, DataWithCoords
1818
from .coordinates import (
1919
DataArrayCoordinates, LevelCoordinatesSource, assert_coordinate_consistent,
@@ -986,6 +986,18 @@ def sel_points(self, dim='points', method=None, tolerance=None,
986986
dim=dim, method=method, tolerance=tolerance, **indexers)
987987
return self._from_temp_dataset(ds)
988988

989+
def broadcast_like(self, other: Union['DataArray', Dataset]) -> 'DataArray':
990+
"""Broadcast this DataArray against another Dataset or DataArray.
991+
This is equivalent to xr.broadcast(other, self)[1]
992+
993+
Parameters
994+
----------
995+
other : Dataset or DataArray
996+
Object against which to broadcast this array.
997+
"""
998+
999+
return broadcast(other, self)[1]
1000+
9891001
def reindex_like(self, other: Union['DataArray', Dataset],
9901002
method: Optional[str] = None, tolerance=None,
9911003
copy: bool = True, fill_value=dtypes.NA) -> 'DataArray':

xarray/core/dataset.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from ..coding.cftimeindex import _parse_array_of_cftime_strings
1616
from . import (alignment, dtypes, duck_array_ops, formatting, groupby,
1717
indexing, ops, pdcompat, resample, rolling, utils)
18-
from .alignment import align
18+
from .alignment import align, broadcast
1919
from .common import (ALL_DIMS, DataWithCoords, ImplementsDatasetReduce,
2020
_contains_datetime_like_objects)
2121
from .coordinates import (DatasetCoordinates, LevelCoordinatesSource,
@@ -1978,6 +1978,18 @@ def sel_points(self, dim='points', method=None, tolerance=None,
19781978
)
19791979
return self.isel_points(dim=dim, **pos_indexers)
19801980

1981+
def broadcast_like(self, other: Union['Dataset', 'DataArray']) -> 'Dataset':
1982+
"""Broadcast this DataArray against another Dataset or DataArray.
1983+
This is equivalent to xr.broadcast(other, self)[1]
1984+
1985+
Parameters
1986+
----------
1987+
other : Dataset or DataArray
1988+
Object against which to broadcast this array.
1989+
"""
1990+
1991+
return broadcast(other, self)[1]
1992+
19811993
def reindex_like(self, other, method=None, tolerance=None, copy=True,
19821994
fill_value=dtypes.NA):
19831995
"""Conform this object onto the indexes of another object, filling in

xarray/tests/test_dataarray.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,21 @@ def test_coords_non_string(self):
12391239
expected = DataArray(2, coords={1: 2}, name=1)
12401240
assert_identical(actual, expected)
12411241

1242+
def test_broadcast_like(self):
1243+
original1 = DataArray(np.random.randn(5),
1244+
[('x', range(5))])
1245+
1246+
original2 = DataArray(np.random.randn(6),
1247+
[('y', range(6))])
1248+
1249+
expected1, expected2 = broadcast(original1, original2)
1250+
1251+
assert_identical(original1.broadcast_like(original2),
1252+
expected1.transpose('y', 'x'))
1253+
1254+
assert_identical(original2.broadcast_like(original1),
1255+
expected2)
1256+
12421257
def test_reindex_like(self):
12431258
foo = DataArray(np.random.randn(5, 6),
12441259
[('x', range(5)), ('y', range(6))])

xarray/tests/test_dataset.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,6 +1560,21 @@ def test_sel(lab_indexer, pos_indexer, replaced_idx=False,
15601560
assert_identical(mdata.sel(x={'one': 'a', 'two': 1}),
15611561
mdata.sel(one='a', two=1))
15621562

1563+
def test_broadcast_like(self):
1564+
original1 = DataArray(np.random.randn(5),
1565+
[('x', range(5))], name='a').to_dataset()
1566+
1567+
original2 = DataArray(np.random.randn(6),
1568+
[('y', range(6))], name='b')
1569+
1570+
expected1, expected2 = broadcast(original1, original2)
1571+
1572+
assert_identical(original1.broadcast_like(original2),
1573+
expected1.transpose('y', 'x'))
1574+
1575+
assert_identical(original2.broadcast_like(original1),
1576+
expected2)
1577+
15631578
def test_reindex_like(self):
15641579
data = create_test_data()
15651580
data['letters'] = ('dim3', 10 * ['a'])

0 commit comments

Comments
 (0)