@@ -4561,6 +4561,71 @@ def should_add_coord_to_array(self, name, var, dims):
45614561 assert_identical (actual .coords , coords , check_default_indexes = False )
45624562 assert "x_bnds" not in actual .dims
45634563
4564+ def test_copy_listed_preserves_multi_coord_index (self ) -> None :
4565+ # Regression test for https://github.com/pydata/xarray/issues/11215
4566+ # Multi-coordinate indexes spanning multiple dims should be preserved
4567+ # when subsetting a Dataset by variable names via ds[["var"]].
4568+ class MultiDimIndex (Index ):
4569+ def should_add_coord_to_array (self , name , var , dims ):
4570+ return True
4571+
4572+ idx = MultiDimIndex ()
4573+ coords = Coordinates (
4574+ coords = {
4575+ "node_x" : ("nodes" , [0.0 , 1.0 , 2.0 ]),
4576+ "node_y" : ("nodes" , [0.0 , 0.0 , 1.0 ]),
4577+ "face_x" : ("faces" , [0.5 , 1.5 ]),
4578+ "face_y" : ("faces" , [0.5 , 0.5 ]),
4579+ },
4580+ indexes = dict .fromkeys (["node_x" , "node_y" , "face_x" , "face_y" ], idx ),
4581+ )
4582+ ds = Dataset (
4583+ {
4584+ "node_data" : (("nodes" ,), [1.0 , 2.0 , 3.0 ]),
4585+ "face_data" : (("faces" ,), [10.0 , 20.0 ]),
4586+ },
4587+ coords = coords ,
4588+ )
4589+
4590+ node_subset = ds [["node_data" ]]
4591+ face_subset = ds [["face_data" ]]
4592+
4593+ for ds_sub in [node_subset , face_subset ]:
4594+ for name in ["node_x" , "node_y" , "face_x" , "face_y" ]:
4595+ assert name in ds_sub .coords
4596+ assert isinstance (ds_sub .xindexes [name ], MultiDimIndex )
4597+
4598+ def test_to_dataarray_preserves_multi_coord_index (self ) -> None :
4599+ # Regression test for https://github.com/pydata/xarray/issues/11215
4600+ # Multi-coordinate indexes spanning multiple dims should be preserved
4601+ # when converting a Dataset to a DataArray via to_dataarray().
4602+ class MultiDimIndex (Index ):
4603+ def should_add_coord_to_array (self , name , var , dims ):
4604+ return True
4605+
4606+ idx = MultiDimIndex ()
4607+ coords = Coordinates (
4608+ coords = {
4609+ "node_x" : ("nodes" , [0.0 , 1.0 , 2.0 ]),
4610+ "node_y" : ("nodes" , [0.0 , 0.0 , 1.0 ]),
4611+ "face_x" : ("faces" , [0.5 , 1.5 ]),
4612+ "face_y" : ("faces" , [0.5 , 0.5 ]),
4613+ },
4614+ indexes = dict .fromkeys (["node_x" , "node_y" , "face_x" , "face_y" ], idx ),
4615+ )
4616+ ds = Dataset (
4617+ {
4618+ "node_data" : (("nodes" ,), [1.0 , 2.0 , 3.0 ]),
4619+ },
4620+ coords = coords ,
4621+ )
4622+
4623+ da = ds .to_dataarray ()
4624+
4625+ for name in ["node_x" , "node_y" , "face_x" , "face_y" ]:
4626+ assert name in da .coords
4627+ assert isinstance (da .xindexes [name ], MultiDimIndex )
4628+
45644629 def test_virtual_variables_default_coords (self ) -> None :
45654630 dataset = Dataset ({"foo" : ("x" , range (10 ))})
45664631 expected1 = DataArray (range (10 ), dims = "x" , name = "x" )
0 commit comments