105
105
from xarray .core .utils import (
106
106
Default ,
107
107
Frozen ,
108
+ FrozenMappingWarningOnValuesAccess ,
108
109
HybridMappingProxy ,
109
110
OrderedSet ,
110
111
_default ,
@@ -778,14 +779,15 @@ def dims(self) -> Frozen[Hashable, int]:
778
779
779
780
Note that type of this object differs from `DataArray.dims`.
780
781
See `Dataset.sizes` and `DataArray.sizes` for consistently named
781
- properties.
782
+ properties. This property will be changed to return a type more consistent with
783
+ `DataArray.dims` in the future, i.e. a set of dimension names.
782
784
783
785
See Also
784
786
--------
785
787
Dataset.sizes
786
788
DataArray.dims
787
789
"""
788
- return Frozen (self ._dims )
790
+ return FrozenMappingWarningOnValuesAccess (self ._dims )
789
791
790
792
@property
791
793
def sizes (self ) -> Frozen [Hashable , int ]:
@@ -800,7 +802,7 @@ def sizes(self) -> Frozen[Hashable, int]:
800
802
--------
801
803
DataArray.sizes
802
804
"""
803
- return self .dims
805
+ return Frozen ( self ._dims )
804
806
805
807
@property
806
808
def dtypes (self ) -> Frozen [Hashable , np .dtype ]:
@@ -1411,7 +1413,7 @@ def _copy_listed(self, names: Iterable[Hashable]) -> Self:
1411
1413
variables [name ] = self ._variables [name ]
1412
1414
except KeyError :
1413
1415
ref_name , var_name , var = _get_virtual_variable (
1414
- self ._variables , name , self .dims
1416
+ self ._variables , name , self .sizes
1415
1417
)
1416
1418
variables [var_name ] = var
1417
1419
if ref_name in self ._coord_names or ref_name in self .dims :
@@ -1426,7 +1428,7 @@ def _copy_listed(self, names: Iterable[Hashable]) -> Self:
1426
1428
for v in variables .values ():
1427
1429
needed_dims .update (v .dims )
1428
1430
1429
- dims = {k : self .dims [k ] for k in needed_dims }
1431
+ dims = {k : self .sizes [k ] for k in needed_dims }
1430
1432
1431
1433
# preserves ordering of coordinates
1432
1434
for k in self ._variables :
@@ -1448,7 +1450,7 @@ def _construct_dataarray(self, name: Hashable) -> DataArray:
1448
1450
try :
1449
1451
variable = self ._variables [name ]
1450
1452
except KeyError :
1451
- _ , name , variable = _get_virtual_variable (self ._variables , name , self .dims )
1453
+ _ , name , variable = _get_virtual_variable (self ._variables , name , self .sizes )
1452
1454
1453
1455
needed_dims = set (variable .dims )
1454
1456
@@ -1475,7 +1477,7 @@ def _item_sources(self) -> Iterable[Mapping[Hashable, Any]]:
1475
1477
yield HybridMappingProxy (keys = self ._coord_names , mapping = self .coords )
1476
1478
1477
1479
# virtual coordinates
1478
- yield HybridMappingProxy (keys = self .dims , mapping = self )
1480
+ yield HybridMappingProxy (keys = self .sizes , mapping = self )
1479
1481
1480
1482
def __contains__ (self , key : object ) -> bool :
1481
1483
"""The 'in' operator will return true or false depending on whether
@@ -2569,7 +2571,7 @@ def info(self, buf: IO | None = None) -> None:
2569
2571
lines = []
2570
2572
lines .append ("xarray.Dataset {" )
2571
2573
lines .append ("dimensions:" )
2572
- for name , size in self .dims .items ():
2574
+ for name , size in self .sizes .items ():
2573
2575
lines .append (f"\t { name } = { size } ;" )
2574
2576
lines .append ("\n variables:" )
2575
2577
for name , da in self .variables .items ():
@@ -2697,10 +2699,10 @@ def chunk(
2697
2699
else :
2698
2700
chunks_mapping = either_dict_or_kwargs (chunks , chunks_kwargs , "chunk" )
2699
2701
2700
- bad_dims = chunks_mapping .keys () - self .dims .keys ()
2702
+ bad_dims = chunks_mapping .keys () - self .sizes .keys ()
2701
2703
if bad_dims :
2702
2704
raise ValueError (
2703
- f"chunks keys { tuple (bad_dims )} not found in data dimensions { tuple (self .dims )} "
2705
+ f"chunks keys { tuple (bad_dims )} not found in data dimensions { tuple (self .sizes . keys () )} "
2704
2706
)
2705
2707
2706
2708
chunkmanager = guess_chunkmanager (chunked_array_type )
@@ -3952,7 +3954,7 @@ def maybe_variable(obj, k):
3952
3954
try :
3953
3955
return obj ._variables [k ]
3954
3956
except KeyError :
3955
- return as_variable ((k , range (obj .dims [k ])))
3957
+ return as_variable ((k , range (obj .sizes [k ])))
3956
3958
3957
3959
def _validate_interp_indexer (x , new_x ):
3958
3960
# In the case of datetimes, the restrictions placed on indexers
@@ -4176,7 +4178,7 @@ def _rename_vars(
4176
4178
return variables , coord_names
4177
4179
4178
4180
def _rename_dims (self , name_dict : Mapping [Any , Hashable ]) -> dict [Hashable , int ]:
4179
- return {name_dict .get (k , k ): v for k , v in self .dims .items ()}
4181
+ return {name_dict .get (k , k ): v for k , v in self .sizes .items ()}
4180
4182
4181
4183
def _rename_indexes (
4182
4184
self , name_dict : Mapping [Any , Hashable ], dims_dict : Mapping [Any , Hashable ]
@@ -5168,7 +5170,7 @@ def _get_stack_index(
5168
5170
if dim in self ._variables :
5169
5171
var = self ._variables [dim ]
5170
5172
else :
5171
- _ , _ , var = _get_virtual_variable (self ._variables , dim , self .dims )
5173
+ _ , _ , var = _get_virtual_variable (self ._variables , dim , self .sizes )
5172
5174
# dummy index (only `stack_coords` will be used to construct the multi-index)
5173
5175
stack_index = PandasIndex ([0 ], dim )
5174
5176
stack_coords = {dim : var }
@@ -5195,7 +5197,7 @@ def _stack_once(
5195
5197
if any (d in var .dims for d in dims ):
5196
5198
add_dims = [d for d in dims if d not in var .dims ]
5197
5199
vdims = list (var .dims ) + add_dims
5198
- shape = [self .dims [d ] for d in vdims ]
5200
+ shape = [self .sizes [d ] for d in vdims ]
5199
5201
exp_var = var .set_dims (vdims , shape )
5200
5202
stacked_var = exp_var .stack (** {new_dim : dims })
5201
5203
new_variables [name ] = stacked_var
@@ -6351,15 +6353,15 @@ def dropna(
6351
6353
if subset is None :
6352
6354
subset = iter (self .data_vars )
6353
6355
6354
- count = np .zeros (self .dims [dim ], dtype = np .int64 )
6356
+ count = np .zeros (self .sizes [dim ], dtype = np .int64 )
6355
6357
size = np .int_ (0 ) # for type checking
6356
6358
6357
6359
for k in subset :
6358
6360
array = self ._variables [k ]
6359
6361
if dim in array .dims :
6360
6362
dims = [d for d in array .dims if d != dim ]
6361
6363
count += np .asarray (array .count (dims ))
6362
- size += math .prod ([self .dims [d ] for d in dims ])
6364
+ size += math .prod ([self .sizes [d ] for d in dims ])
6363
6365
6364
6366
if thresh is not None :
6365
6367
mask = count >= thresh
@@ -7136,7 +7138,7 @@ def _normalize_dim_order(
7136
7138
f"Dataset: { list (self .dims )} "
7137
7139
)
7138
7140
7139
- ordered_dims = {k : self .dims [k ] for k in dim_order }
7141
+ ordered_dims = {k : self .sizes [k ] for k in dim_order }
7140
7142
7141
7143
return ordered_dims
7142
7144
@@ -7396,7 +7398,7 @@ def to_dask_dataframe(
7396
7398
var = self .variables [name ]
7397
7399
except KeyError :
7398
7400
# dimension without a matching coordinate
7399
- size = self .dims [name ]
7401
+ size = self .sizes [name ]
7400
7402
data = da .arange (size , chunks = size , dtype = np .int64 )
7401
7403
var = Variable ((name ,), data )
7402
7404
@@ -7469,7 +7471,7 @@ def to_dict(
7469
7471
d : dict = {
7470
7472
"coords" : {},
7471
7473
"attrs" : decode_numpy_dict_values (self .attrs ),
7472
- "dims" : dict (self .dims ),
7474
+ "dims" : dict (self .sizes ),
7473
7475
"data_vars" : {},
7474
7476
}
7475
7477
for k in self .coords :
0 commit comments