@@ -607,7 +607,7 @@ def _construct_direct(cls, variables, coord_names, dims, attrs,
607607 __default_attrs = object ()
608608
609609 def _replace_vars_and_dims (self , variables , coord_names = None ,
610- attrs = __default_attrs ):
610+ attrs = __default_attrs , inplace = False ):
611611 """Fastpath constructor for internal use.
612612
613613 Preserves coord names and attributes; dimensions are recalculated from
@@ -628,11 +628,21 @@ def _replace_vars_and_dims(self, variables, coord_names=None,
628628 new : Dataset
629629 """
630630 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
636646
637647 def copy (self , deep = False ):
638648 """Returns a copy of this dataset.
@@ -1221,6 +1231,12 @@ def rename(self, name_dict, inplace=False):
12211231 -------
12221232 renamed : Dataset
12231233 Dataset with renamed variables and dimensions.
1234+
1235+ See Also
1236+ --------
1237+
1238+ Dataset.swap_dims
1239+ DataArray.rename
12241240 """
12251241 for k in name_dict :
12261242 if k not in self :
@@ -1237,14 +1253,57 @@ def rename(self, name_dict, inplace=False):
12371253 if k in self ._coord_names :
12381254 coord_names .add (name )
12391255
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 )
12481307
12491308 def update (self , other , inplace = True ):
12501309 """Update this dataset's variables with those from another dataset.
0 commit comments