@@ -607,7 +607,7 @@ def _construct_direct(cls, variables, coord_names, dims, attrs,
607
607
__default_attrs = object ()
608
608
609
609
def _replace_vars_and_dims (self , variables , coord_names = None ,
610
- attrs = __default_attrs ):
610
+ attrs = __default_attrs , inplace = False ):
611
611
"""Fastpath constructor for internal use.
612
612
613
613
Preserves coord names and attributes; dimensions are recalculated from
@@ -628,11 +628,21 @@ def _replace_vars_and_dims(self, variables, coord_names=None,
628
628
new : Dataset
629
629
"""
630
630
dims = _calculate_dims (variables )
631
- if coord_names is None :
632
- coord_names = self ._coord_names .copy ()
633
- if attrs is self .__default_attrs :
634
- attrs = self ._attrs_copy ()
635
- return self ._construct_direct (variables , coord_names , dims , attrs )
631
+ if inplace :
632
+ self ._dims = dims
633
+ self ._variables = variables
634
+ if coord_names is not None :
635
+ self ._coord_names = coord_names
636
+ if attrs is not self .__default_attrs :
637
+ self ._attrs = attrs
638
+ obj = self
639
+ else :
640
+ if coord_names is None :
641
+ coord_names = self ._coord_names .copy ()
642
+ if attrs is self .__default_attrs :
643
+ attrs = self ._attrs_copy ()
644
+ obj = self ._construct_direct (variables , coord_names , dims , attrs )
645
+ return obj
636
646
637
647
def copy (self , deep = False ):
638
648
"""Returns a copy of this dataset.
@@ -1221,6 +1231,12 @@ def rename(self, name_dict, inplace=False):
1221
1231
-------
1222
1232
renamed : Dataset
1223
1233
Dataset with renamed variables and dimensions.
1234
+
1235
+ See Also
1236
+ --------
1237
+
1238
+ Dataset.swap_dims
1239
+ DataArray.rename
1224
1240
"""
1225
1241
for k in name_dict :
1226
1242
if k not in self :
@@ -1237,14 +1253,57 @@ def rename(self, name_dict, inplace=False):
1237
1253
if k in self ._coord_names :
1238
1254
coord_names .add (name )
1239
1255
1240
- if inplace :
1241
- self ._dims = _calculate_dims (variables )
1242
- self ._variables = variables
1243
- self ._coord_names = coord_names
1244
- obj = self
1245
- else :
1246
- obj = self ._replace_vars_and_dims (variables , coord_names )
1247
- return obj
1256
+ return self ._replace_vars_and_dims (variables , coord_names ,
1257
+ inplace = inplace )
1258
+
1259
+ def swap_dims (self , dims_dict , inplace = False ):
1260
+ """Returns a new object with swapped dimensions.
1261
+
1262
+ Parameters
1263
+ ----------
1264
+ dims_dict : dict-like
1265
+ Dictionary whose keys are current dimension names and whose values
1266
+ are new names. Each value must already be a variable in the
1267
+ dataset.
1268
+ inplace : bool, optional
1269
+ If True, swap dimensions in-place. Otherwise, return a new dataset
1270
+ object.
1271
+
1272
+ Returns
1273
+ -------
1274
+ renamed : Dataset
1275
+ Dataset with swapped dimensions.
1276
+
1277
+ See Also
1278
+ --------
1279
+
1280
+ Dataset.rename
1281
+ DataArray.swap_dims
1282
+ """
1283
+ for k , v in dims_dict .items ():
1284
+ if k not in self .dims :
1285
+ raise ValueError ('cannot swap from dimension %r because it is '
1286
+ 'not an existing dimension' % k )
1287
+ if self .variables [v ].dims != (k ,):
1288
+ raise ValueError ('replacement dimension %r is not a 1D '
1289
+ 'variable along the old dimension %r'
1290
+ % (v , k ))
1291
+
1292
+ result_dims = set (dims_dict .get (dim , dim ) for dim in self .dims )
1293
+
1294
+ variables = OrderedDict ()
1295
+
1296
+ coord_names = self ._coord_names .copy ()
1297
+ coord_names .update (dims_dict .values ())
1298
+
1299
+ for k , v in iteritems (self .variables ):
1300
+ dims = tuple (dims_dict .get (dim , dim ) for dim in v .dims )
1301
+ var = v .to_coord () if k in result_dims else v .to_variable ()
1302
+ var .dims = dims
1303
+ variables [k ] = var
1304
+
1305
+ return self ._replace_vars_and_dims (variables , coord_names ,
1306
+ inplace = inplace )
1248
1307
1249
1308
def update (self , other , inplace = True ):
1250
1309
"""Update this dataset's variables with those from another dataset.
0 commit comments