Skip to content

Commit 33cdabd

Browse files
authored
Remove xarray.ufuncs (#6491)
* Remove xarray.ufuncs * Remove ufunc docs
1 parent ea99445 commit 33cdabd

File tree

8 files changed

+11
-406
lines changed

8 files changed

+11
-406
lines changed

doc/api-hidden.rst

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -319,66 +319,6 @@
319319
IndexVariable.sizes
320320
IndexVariable.values
321321

322-
ufuncs.angle
323-
ufuncs.arccos
324-
ufuncs.arccosh
325-
ufuncs.arcsin
326-
ufuncs.arcsinh
327-
ufuncs.arctan
328-
ufuncs.arctan2
329-
ufuncs.arctanh
330-
ufuncs.ceil
331-
ufuncs.conj
332-
ufuncs.copysign
333-
ufuncs.cos
334-
ufuncs.cosh
335-
ufuncs.deg2rad
336-
ufuncs.degrees
337-
ufuncs.exp
338-
ufuncs.expm1
339-
ufuncs.fabs
340-
ufuncs.fix
341-
ufuncs.floor
342-
ufuncs.fmax
343-
ufuncs.fmin
344-
ufuncs.fmod
345-
ufuncs.fmod
346-
ufuncs.frexp
347-
ufuncs.hypot
348-
ufuncs.imag
349-
ufuncs.iscomplex
350-
ufuncs.isfinite
351-
ufuncs.isinf
352-
ufuncs.isnan
353-
ufuncs.isreal
354-
ufuncs.ldexp
355-
ufuncs.log
356-
ufuncs.log10
357-
ufuncs.log1p
358-
ufuncs.log2
359-
ufuncs.logaddexp
360-
ufuncs.logaddexp2
361-
ufuncs.logical_and
362-
ufuncs.logical_not
363-
ufuncs.logical_or
364-
ufuncs.logical_xor
365-
ufuncs.maximum
366-
ufuncs.minimum
367-
ufuncs.nextafter
368-
ufuncs.rad2deg
369-
ufuncs.radians
370-
ufuncs.real
371-
ufuncs.rint
372-
ufuncs.sign
373-
ufuncs.signbit
374-
ufuncs.sin
375-
ufuncs.sinh
376-
ufuncs.sqrt
377-
ufuncs.square
378-
ufuncs.tan
379-
ufuncs.tanh
380-
ufuncs.trunc
381-
382322
plot.plot
383323
plot.line
384324
plot.step

doc/api.rst

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -610,84 +610,6 @@ Plotting
610610
DataArray.plot.step
611611
DataArray.plot.surface
612612

613-
.. _api.ufuncs:
614-
615-
Universal functions
616-
===================
617-
618-
.. warning::
619-
620-
With recent versions of NumPy, Dask and xarray, NumPy ufuncs are now
621-
supported directly on all xarray and Dask objects. This obviates the need
622-
for the ``xarray.ufuncs`` module, which should not be used for new code
623-
unless compatibility with versions of NumPy prior to v1.13 is
624-
required. They will be removed once support for NumPy prior to
625-
v1.17 is dropped.
626-
627-
These functions are copied from NumPy, but extended to work on NumPy arrays,
628-
dask arrays and all xarray objects. You can find them in the ``xarray.ufuncs``
629-
module:
630-
631-
:py:attr:`~ufuncs.angle`
632-
:py:attr:`~ufuncs.arccos`
633-
:py:attr:`~ufuncs.arccosh`
634-
:py:attr:`~ufuncs.arcsin`
635-
:py:attr:`~ufuncs.arcsinh`
636-
:py:attr:`~ufuncs.arctan`
637-
:py:attr:`~ufuncs.arctan2`
638-
:py:attr:`~ufuncs.arctanh`
639-
:py:attr:`~ufuncs.ceil`
640-
:py:attr:`~ufuncs.conj`
641-
:py:attr:`~ufuncs.copysign`
642-
:py:attr:`~ufuncs.cos`
643-
:py:attr:`~ufuncs.cosh`
644-
:py:attr:`~ufuncs.deg2rad`
645-
:py:attr:`~ufuncs.degrees`
646-
:py:attr:`~ufuncs.exp`
647-
:py:attr:`~ufuncs.expm1`
648-
:py:attr:`~ufuncs.fabs`
649-
:py:attr:`~ufuncs.fix`
650-
:py:attr:`~ufuncs.floor`
651-
:py:attr:`~ufuncs.fmax`
652-
:py:attr:`~ufuncs.fmin`
653-
:py:attr:`~ufuncs.fmod`
654-
:py:attr:`~ufuncs.fmod`
655-
:py:attr:`~ufuncs.frexp`
656-
:py:attr:`~ufuncs.hypot`
657-
:py:attr:`~ufuncs.imag`
658-
:py:attr:`~ufuncs.iscomplex`
659-
:py:attr:`~ufuncs.isfinite`
660-
:py:attr:`~ufuncs.isinf`
661-
:py:attr:`~ufuncs.isnan`
662-
:py:attr:`~ufuncs.isreal`
663-
:py:attr:`~ufuncs.ldexp`
664-
:py:attr:`~ufuncs.log`
665-
:py:attr:`~ufuncs.log10`
666-
:py:attr:`~ufuncs.log1p`
667-
:py:attr:`~ufuncs.log2`
668-
:py:attr:`~ufuncs.logaddexp`
669-
:py:attr:`~ufuncs.logaddexp2`
670-
:py:attr:`~ufuncs.logical_and`
671-
:py:attr:`~ufuncs.logical_not`
672-
:py:attr:`~ufuncs.logical_or`
673-
:py:attr:`~ufuncs.logical_xor`
674-
:py:attr:`~ufuncs.maximum`
675-
:py:attr:`~ufuncs.minimum`
676-
:py:attr:`~ufuncs.nextafter`
677-
:py:attr:`~ufuncs.rad2deg`
678-
:py:attr:`~ufuncs.radians`
679-
:py:attr:`~ufuncs.real`
680-
:py:attr:`~ufuncs.rint`
681-
:py:attr:`~ufuncs.sign`
682-
:py:attr:`~ufuncs.signbit`
683-
:py:attr:`~ufuncs.sin`
684-
:py:attr:`~ufuncs.sinh`
685-
:py:attr:`~ufuncs.sqrt`
686-
:py:attr:`~ufuncs.square`
687-
:py:attr:`~ufuncs.tan`
688-
:py:attr:`~ufuncs.tanh`
689-
:py:attr:`~ufuncs.trunc`
690-
691613
IO / Conversion
692614
===============
693615

doc/whats-new.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ Breaking changes
5151
- Many arguments like ``keep_attrs``, ``axis``, and ``skipna`` are now keyword
5252
only for all reduction operations like ``.mean``.
5353
By `Deepak Cherian <https://github.com/dcherian>`_, `Jimmy Westling <https://github.com/illviljan>`_.
54+
- Xarray's ufuncs have been removed, now that they can be replaced by numpy's ufuncs in all
55+
supported versions of numpy.
56+
By `Maximilian Roos <https://github.com/max-sixty>`_.
5457

5558
Deprecations
5659
~~~~~~~~~~~~

xarray/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from . import testing, tutorial, ufuncs
1+
from . import testing, tutorial
22
from .backends.api import (
33
load_dataarray,
44
load_dataset,
@@ -53,7 +53,6 @@
5353
# `mypy --strict` running in projects that import xarray.
5454
__all__ = (
5555
# Sub-packages
56-
"ufuncs",
5756
"testing",
5857
"tutorial",
5958
# Top-level functions

xarray/tests/test_dask.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from packaging.version import Version
1111

1212
import xarray as xr
13-
import xarray.ufuncs as xu
1413
from xarray import DataArray, Dataset, Variable
1514
from xarray.core import duck_array_ops
1615
from xarray.core.pycompat import dask_version
@@ -265,18 +264,16 @@ def test_missing_methods(self):
265264
except NotImplementedError as err:
266265
assert "dask" in str(err)
267266

268-
@pytest.mark.filterwarnings("ignore::FutureWarning")
269267
def test_univariate_ufunc(self):
270268
u = self.eager_var
271269
v = self.lazy_var
272-
self.assertLazyAndAllClose(np.sin(u), xu.sin(v))
270+
self.assertLazyAndAllClose(np.sin(u), np.sin(v))
273271

274-
@pytest.mark.filterwarnings("ignore::FutureWarning")
275272
def test_bivariate_ufunc(self):
276273
u = self.eager_var
277274
v = self.lazy_var
278-
self.assertLazyAndAllClose(np.maximum(u, 0), xu.maximum(v, 0))
279-
self.assertLazyAndAllClose(np.maximum(u, 0), xu.maximum(0, v))
275+
self.assertLazyAndAllClose(np.maximum(u, 0), np.maximum(v, 0))
276+
self.assertLazyAndAllClose(np.maximum(u, 0), np.maximum(0, v))
280277

281278
def test_compute(self):
282279
u = self.eager_var
@@ -605,11 +602,10 @@ def duplicate_and_merge(array):
605602
actual = duplicate_and_merge(self.lazy_array)
606603
self.assertLazyAndEqual(expected, actual)
607604

608-
@pytest.mark.filterwarnings("ignore::FutureWarning")
609605
def test_ufuncs(self):
610606
u = self.eager_array
611607
v = self.lazy_array
612-
self.assertLazyAndAllClose(np.sin(u), xu.sin(v))
608+
self.assertLazyAndAllClose(np.sin(u), np.sin(v))
613609

614610
def test_where_dispatching(self):
615611
a = np.arange(10)

xarray/tests/test_sparse.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from packaging.version import Version
88

99
import xarray as xr
10-
import xarray.ufuncs as xu
1110
from xarray import DataArray, Variable
1211
from xarray.core.pycompat import sparse_array_type, sparse_version
1312

@@ -279,12 +278,12 @@ def test_unary_op(self):
279278

280279
@pytest.mark.filterwarnings("ignore::FutureWarning")
281280
def test_univariate_ufunc(self):
282-
assert_sparse_equal(np.sin(self.data), xu.sin(self.var).data)
281+
assert_sparse_equal(np.sin(self.data), np.sin(self.var).data)
283282

284283
@pytest.mark.filterwarnings("ignore::FutureWarning")
285284
def test_bivariate_ufunc(self):
286-
assert_sparse_equal(np.maximum(self.data, 0), xu.maximum(self.var, 0).data)
287-
assert_sparse_equal(np.maximum(self.data, 0), xu.maximum(0, self.var).data)
285+
assert_sparse_equal(np.maximum(self.data, 0), np.maximum(self.var, 0).data)
286+
assert_sparse_equal(np.maximum(self.data, 0), np.maximum(0, self.var).data)
288287

289288
def test_repr(self):
290289
expected = dedent(
@@ -665,11 +664,6 @@ def test_stack(self):
665664
roundtripped = stacked.unstack()
666665
assert_identical(arr, roundtripped)
667666

668-
@pytest.mark.filterwarnings("ignore::FutureWarning")
669-
def test_ufuncs(self):
670-
x = self.sp_xr
671-
assert_equal(np.sin(x), xu.sin(x))
672-
673667
def test_dataarray_repr(self):
674668
a = xr.DataArray(
675669
sparse.COO.from_numpy(np.ones(4)),

xarray/tests/test_ufuncs.py

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
import pickle
2-
31
import numpy as np
42
import pytest
53

64
import xarray as xr
7-
import xarray.ufuncs as xu
85

96
from . import assert_array_equal
107
from . import assert_identical as assert_identical_
@@ -158,52 +155,3 @@ def test_gufuncs():
158155
fake_gufunc = mock.Mock(signature="(n)->()", autospec=np.sin)
159156
with pytest.raises(NotImplementedError, match=r"generalized ufuncs"):
160157
xarray_obj.__array_ufunc__(fake_gufunc, "__call__", xarray_obj)
161-
162-
163-
def test_xarray_ufuncs_deprecation():
164-
with pytest.warns(FutureWarning, match="xarray.ufuncs"):
165-
xu.cos(xr.DataArray([0, 1]))
166-
167-
with assert_no_warnings():
168-
xu.angle(xr.DataArray([0, 1]))
169-
170-
171-
@pytest.mark.filterwarnings("ignore::RuntimeWarning")
172-
@pytest.mark.parametrize(
173-
"name",
174-
[
175-
name
176-
for name in dir(xu)
177-
if (
178-
not name.startswith("_")
179-
and hasattr(np, name)
180-
and name not in ["print_function", "absolute_import", "division"]
181-
)
182-
],
183-
)
184-
def test_numpy_ufuncs(name, request):
185-
x = xr.DataArray([1, 1])
186-
187-
np_func = getattr(np, name)
188-
if hasattr(np_func, "nin") and np_func.nin == 2:
189-
args = (x, x)
190-
else:
191-
args = (x,)
192-
193-
y = np_func(*args)
194-
195-
if name in ["angle", "iscomplex"]:
196-
# these functions need to be handled with __array_function__ protocol
197-
assert isinstance(y, np.ndarray)
198-
elif name in ["frexp"]:
199-
# np.frexp returns a tuple
200-
assert not isinstance(y, xr.DataArray)
201-
else:
202-
assert isinstance(y, xr.DataArray)
203-
204-
205-
@pytest.mark.filterwarnings("ignore:xarray.ufuncs")
206-
def test_xarray_ufuncs_pickle():
207-
a = 1.0
208-
cos_pickled = pickle.loads(pickle.dumps(xu.cos))
209-
assert_identical(cos_pickled(a), xu.cos(a))

0 commit comments

Comments
 (0)