@@ -372,16 +372,20 @@ def __getitem__(self, item):
372372 if not (len (item ) == len (self .table ) or len (item ) == self .table [0 ].ndim ):
373373 raise ValueError ("Can not slice with incorrect length" )
374374
375+ # Since underlying tables store corner and center values, item must be changed to reflect this.
376+ new_item = _convert_cube_item_to_table_item (item )
377+
375378 new_components = defaultdict (list )
376379 new_components ["dropped_world_dimensions" ] = copy .deepcopy (self ._dropped_world_dimensions )
377380
378- for i , (ele , table ) in enumerate (zip (item , self .table )):
379- self ._slice_table (i , table , ele , new_components , whole_slice = item )
381+ for i , (ele , table ) in enumerate (zip (new_item , self .table )):
382+ self ._slice_table (i , table , ele , new_components , whole_slice = new_item )
380383
381384 names = new_components ["names" ] or None
382385 physical_types = new_components ["physical_types" ] or None
383386
384- ret_table = type (self )(* new_components ["tables" ], names = names , physical_types = physical_types )
387+ ret_table = type (self )(* new_components ["tables" ], names = names , physical_types = physical_types ,
388+ grid_points = "centers and corners" )
385389 ret_table ._dropped_world_dimensions = new_components ["dropped_world_dimensions" ]
386390 return ret_table
387391
@@ -750,13 +754,17 @@ def __init__(self, *tables, names=None, physical_types=None, reference_time=None
750754 self .reference_time = reference_time or self .table [0 ]
751755
752756 def __getitem__ (self , item ):
753- if not (isinstance (item , (slice , Integral )) or len (item ) == 1 ):
757+ if isinstance (item , (slice , Integral )):
758+ item = (item ,)
759+ elif len (item ) != 1 :
754760 raise ValueError ("Can not slice with incorrect length" )
755-
756- return type (self )(self .table [item ],
761+ # Since table grid includes centers and corners, the input item must be changes accordingly.
762+ new_item = _convert_cube_item_to_table_item (item )[0 ]
763+ return type (self )(self .table [new_item ],
757764 names = self .names ,
758765 physical_types = self .physical_types ,
759- reference_time = self .reference_time )
766+ reference_time = self .reference_time ,
767+ grid_points = "centers and corners" )
760768
761769 @property
762770 def n_inputs (self ):
@@ -1004,6 +1012,8 @@ def interpolate(self, new_array_grids, **kwargs):
10041012
10051013
10061014def _get_grid_from_centers (tables ):
1015+ if not hasattr (tables , "__len__" ):
1016+ return tables
10071017 new_tables = []
10081018 for table in tables :
10091019 new_table = np .zeros (len (table ) * 2 + 1 )
@@ -1019,6 +1029,8 @@ def _get_grid_from_centers(tables):
10191029
10201030
10211031def _get_grid_from_corners (tables ):
1032+ if not hasattr (tables , "__len__" ):
1033+ return tables
10221034 new_tables = []
10231035 for table in tables :
10241036 new_table = np .zeros (len (table ) * 2 - 1 )
@@ -1029,3 +1041,17 @@ def _get_grid_from_corners(tables):
10291041 new_table *= table .unit
10301042 new_tables .append (new_table )
10311043 return tuple (new_tables )
1044+
1045+
1046+ def _convert_cube_item_to_table_item (item ):
1047+ new_item = []
1048+ for idx in item :
1049+ # Assume entries in item must be integers or slices. Fancy indexing not supported.
1050+ if isinstance (idx , Integral ):
1051+ new_idx = idx * 2 + 1
1052+ else :
1053+ new_start = None if idx .start is None else idx .start * 2
1054+ new_stop = None if idx .stop is None else idx .stop * 2 + 1
1055+ new_idx = slice (new_start , new_stop )
1056+ new_item .append (new_idx )
1057+ return tuple (new_item )
0 commit comments