Skip to content

Commit 96351b9

Browse files
committed
Update QuantityTableCoordinate and TimeTableCoordinate getitems to reflect centers and corners grid structure.
1 parent 96a9331 commit 96351b9

File tree

1 file changed

+33
-7
lines changed

1 file changed

+33
-7
lines changed

ndcube/extra_coords/table_coord.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

10061014
def _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

10211031
def _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

Comments
 (0)