107
107
CombineAttrsOptions ,
108
108
CompatOptions ,
109
109
DatetimeUnitOptions ,
110
- Ellipsis ,
110
+ Dims ,
111
111
ErrorOptions ,
112
112
ErrorOptionsWithWarn ,
113
113
InterpOptions ,
@@ -1698,14 +1698,14 @@ def set_coords(self: T_Dataset, names: Hashable | Iterable[Hashable]) -> T_Datas
1698
1698
1699
1699
def reset_coords (
1700
1700
self : T_Dataset ,
1701
- names : Hashable | Iterable [ Hashable ] | None = None ,
1701
+ names : Dims = None ,
1702
1702
drop : bool = False ,
1703
1703
) -> T_Dataset :
1704
1704
"""Given names of coordinates, reset them to become variables
1705
1705
1706
1706
Parameters
1707
1707
----------
1708
- names : hashable or iterable of hashable , optional
1708
+ names : str, Iterable of Hashable or None , optional
1709
1709
Name(s) of non-index coordinates in this dataset to reset into
1710
1710
variables. By default, all non-index coordinates are reset.
1711
1711
drop : bool, default: False
@@ -4457,7 +4457,7 @@ def _get_stack_index(
4457
4457
4458
4458
def _stack_once (
4459
4459
self : T_Dataset ,
4460
- dims : Sequence [Hashable | Ellipsis ],
4460
+ dims : Sequence [Hashable | ellipsis ],
4461
4461
new_dim : Hashable ,
4462
4462
index_cls : type [Index ],
4463
4463
create_index : bool | None = True ,
@@ -4516,10 +4516,10 @@ def _stack_once(
4516
4516
4517
4517
def stack (
4518
4518
self : T_Dataset ,
4519
- dimensions : Mapping [Any , Sequence [Hashable | Ellipsis ]] | None = None ,
4519
+ dimensions : Mapping [Any , Sequence [Hashable | ellipsis ]] | None = None ,
4520
4520
create_index : bool | None = True ,
4521
4521
index_cls : type [Index ] = PandasMultiIndex ,
4522
- ** dimensions_kwargs : Sequence [Hashable | Ellipsis ],
4522
+ ** dimensions_kwargs : Sequence [Hashable | ellipsis ],
4523
4523
) -> T_Dataset :
4524
4524
"""
4525
4525
Stack any number of existing dimensions into a single new dimension.
@@ -4770,7 +4770,7 @@ def _unstack_full_reindex(
4770
4770
4771
4771
def unstack (
4772
4772
self : T_Dataset ,
4773
- dim : Hashable | Iterable [ Hashable ] | None = None ,
4773
+ dim : Dims = None ,
4774
4774
fill_value : Any = xrdtypes .NA ,
4775
4775
sparse : bool = False ,
4776
4776
) -> T_Dataset :
@@ -4782,7 +4782,7 @@ def unstack(
4782
4782
4783
4783
Parameters
4784
4784
----------
4785
- dim : hashable or iterable of hashable , optional
4785
+ dim : str, Iterable of Hashable or None , optional
4786
4786
Dimension(s) over which to unstack. By default unstacks all
4787
4787
MultiIndexes.
4788
4788
fill_value : scalar or dict-like, default: nan
@@ -4860,15 +4860,13 @@ def unstack(
4860
4860
for v in nonindexes
4861
4861
)
4862
4862
4863
- for dim in dims :
4863
+ for d in dims :
4864
4864
if needs_full_reindex :
4865
4865
result = result ._unstack_full_reindex (
4866
- dim , stacked_indexes [dim ], fill_value , sparse
4866
+ d , stacked_indexes [d ], fill_value , sparse
4867
4867
)
4868
4868
else :
4869
- result = result ._unstack_once (
4870
- dim , stacked_indexes [dim ], fill_value , sparse
4871
- )
4869
+ result = result ._unstack_once (d , stacked_indexes [d ], fill_value , sparse )
4872
4870
return result
4873
4871
4874
4872
def update (self : T_Dataset , other : CoercibleMapping ) -> T_Dataset :
@@ -5324,15 +5322,15 @@ def drop_isel(self: T_Dataset, indexers=None, **indexers_kwargs) -> T_Dataset:
5324
5322
5325
5323
def drop_dims (
5326
5324
self : T_Dataset ,
5327
- drop_dims : Hashable | Iterable [Hashable ],
5325
+ drop_dims : str | Iterable [Hashable ],
5328
5326
* ,
5329
5327
errors : ErrorOptions = "raise" ,
5330
5328
) -> T_Dataset :
5331
5329
"""Drop dimensions and associated variables from this dataset.
5332
5330
5333
5331
Parameters
5334
5332
----------
5335
- drop_dims : hashable or iterable of hashable
5333
+ drop_dims : str or Iterable of Hashable
5336
5334
Dimension or dimensions to drop.
5337
5335
errors : {"raise", "ignore"}, default: "raise"
5338
5336
If 'raise', raises a ValueError error if any of the
@@ -5763,7 +5761,7 @@ def combine_first(self: T_Dataset, other: T_Dataset) -> T_Dataset:
5763
5761
def reduce (
5764
5762
self : T_Dataset ,
5765
5763
func : Callable ,
5766
- dim : Hashable | Iterable [ Hashable ] = None ,
5764
+ dim : Dims | ellipsis = None ,
5767
5765
* ,
5768
5766
keep_attrs : bool | None = None ,
5769
5767
keepdims : bool = False ,
@@ -5778,8 +5776,8 @@ def reduce(
5778
5776
Function which can be called in the form
5779
5777
`f(x, axis=axis, **kwargs)` to return the result of reducing an
5780
5778
np.ndarray over an integer valued axis.
5781
- dim : str or sequence of str , optional
5782
- Dimension(s) over which to apply `func`. By default `func` is
5779
+ dim : str, Iterable of Hashable or None , optional
5780
+ Dimension(s) over which to apply `func`. By default `func` is
5783
5781
applied over all dimensions.
5784
5782
keep_attrs : bool or None, optional
5785
5783
If True, the dataset's attributes (`attrs`) will be copied from
@@ -5837,18 +5835,15 @@ def reduce(
5837
5835
or np .issubdtype (var .dtype , np .number )
5838
5836
or (var .dtype == np .bool_ )
5839
5837
):
5840
- reduce_maybe_single : Hashable | None | list [Hashable ]
5841
- if len (reduce_dims ) == 1 :
5842
- # unpack dimensions for the benefit of functions
5843
- # like np.argmin which can't handle tuple arguments
5844
- (reduce_maybe_single ,) = reduce_dims
5845
- elif len (reduce_dims ) == var .ndim :
5846
- # prefer to aggregate over axis=None rather than
5847
- # axis=(0, 1) if they will be equivalent, because
5848
- # the former is often more efficient
5849
- reduce_maybe_single = None
5850
- else :
5851
- reduce_maybe_single = reduce_dims
5838
+ # prefer to aggregate over axis=None rather than
5839
+ # axis=(0, 1) if they will be equivalent, because
5840
+ # the former is often more efficient
5841
+ # keep single-element dims as list, to support Hashables
5842
+ reduce_maybe_single = (
5843
+ None
5844
+ if len (reduce_dims ) == var .ndim and var .ndim != 1
5845
+ else reduce_dims
5846
+ )
5852
5847
variables [name ] = var .reduce (
5853
5848
func ,
5854
5849
dim = reduce_maybe_single ,
@@ -6957,7 +6952,7 @@ def sortby(
6957
6952
def quantile (
6958
6953
self : T_Dataset ,
6959
6954
q : ArrayLike ,
6960
- dim : str | Iterable [ Hashable ] | None = None ,
6955
+ dim : Dims = None ,
6961
6956
method : QUANTILE_METHODS = "linear" ,
6962
6957
numeric_only : bool = False ,
6963
6958
keep_attrs : bool = None ,
@@ -8303,7 +8298,9 @@ def argmin(self: T_Dataset, dim: Hashable | None = None, **kwargs) -> T_Dataset:
8303
8298
# Return int index if single dimension is passed, and is not part of a
8304
8299
# sequence
8305
8300
argmin_func = getattr (duck_array_ops , "argmin" )
8306
- return self .reduce (argmin_func , dim = dim , ** kwargs )
8301
+ return self .reduce (
8302
+ argmin_func , dim = None if dim is None else [dim ], ** kwargs
8303
+ )
8307
8304
else :
8308
8305
raise ValueError (
8309
8306
"When dim is a sequence or ..., DataArray.argmin() returns a dict. "
@@ -8361,7 +8358,9 @@ def argmax(self: T_Dataset, dim: Hashable | None = None, **kwargs) -> T_Dataset:
8361
8358
# Return int index if single dimension is passed, and is not part of a
8362
8359
# sequence
8363
8360
argmax_func = getattr (duck_array_ops , "argmax" )
8364
- return self .reduce (argmax_func , dim = dim , ** kwargs )
8361
+ return self .reduce (
8362
+ argmax_func , dim = None if dim is None else [dim ], ** kwargs
8363
+ )
8365
8364
else :
8366
8365
raise ValueError (
8367
8366
"When dim is a sequence or ..., DataArray.argmin() returns a dict. "
@@ -8469,7 +8468,7 @@ def curvefit(
8469
8468
self : T_Dataset ,
8470
8469
coords : str | DataArray | Iterable [str | DataArray ],
8471
8470
func : Callable [..., Any ],
8472
- reduce_dims : Hashable | Iterable [ Hashable ] | None = None ,
8471
+ reduce_dims : Dims = None ,
8473
8472
skipna : bool = True ,
8474
8473
p0 : dict [str , Any ] | None = None ,
8475
8474
bounds : dict [str , Any ] | None = None ,
@@ -8494,7 +8493,7 @@ def curvefit(
8494
8493
array of length `len(x)`. `params` are the fittable parameters which are optimized
8495
8494
by scipy curve_fit. `x` can also be specified as a sequence containing multiple
8496
8495
coordinates, e.g. `f((x0, x1), *params)`.
8497
- reduce_dims : hashable or sequence of hashable
8496
+ reduce_dims : str, Iterable of Hashable or None, optional
8498
8497
Additional dimension(s) over which to aggregate while fitting. For example,
8499
8498
calling `ds.curvefit(coords='time', reduce_dims=['lat', 'lon'], ...)` will
8500
8499
aggregate all lat and lon points and fit the specified function along the
@@ -8545,6 +8544,7 @@ def curvefit(
8545
8544
if kwargs is None :
8546
8545
kwargs = {}
8547
8546
8547
+ reduce_dims_ : list [Hashable ]
8548
8548
if not reduce_dims :
8549
8549
reduce_dims_ = []
8550
8550
elif isinstance (reduce_dims , str ) or not isinstance (reduce_dims , Iterable ):
0 commit comments