ndcube icon indicating copy to clipboard operation
ndcube copied to clipboard

NDCollection does not support the internal representation of `aligned_axes` in the constructor

Open Cadair opened this issue 5 months ago • 2 comments
trafficstars

Describe the bug

While I am loathed to support more permutations of the aligned_axes= keyword argument seeing as we apparently already support nearly every conceivable option, the one we don't support is the one we use internally (the dict) representation.

>>> spice.aligned_axes
{'Mg IX 706 - Peak': (np.int64(1), np.int64(2)),
 'N IV 765 - Peak': (np.int64(1), np.int64(2)),
 'Ne VIII 770 - Peak': (np.int64(1), np.int64(2)),
 'Ly-gamma-CIII group (Merged)': (np.int64(1), np.int64(2)),
 'Ly Beta 1025 (Merged)': (np.int64(1), np.int64(2)),
 'O VI 1032 - Peak': (np.int64(1), np.int64(2))}
>>> new_collection = NDCollection(new_cubes, aligned_axes=spice.aligned_axes)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[23], line 9
      7     c = NDCube(cube, meta=dict(cube.meta))
      8     new_items.append((key, c))
----> 9 spice = NDCollection(new_items, aligned_axes=spice.aligned_axes)
     10 spice

File ~/.virtualenvs/hinode-talk/lib/python3.13/site-packages/ndcube/ndcollection.py:69, in NDCollection.__init__(self, key_data_pairs, aligned_axes, meta, **kwargs)
     67 # Sanitize aligned axes unless hidden kwarg indicates not to.
     68 if sanitize_inputs:
---> 69     aligned_axes = collection_utils._sanitize_aligned_axes(keys, data, aligned_axes)
     70 else:
     71     aligned_axes = dict(zip(keys, aligned_axes))

File ~/.virtualenvs/hinode-talk/lib/python3.13/site-packages/ndcube/utils/collection.py:23, in _sanitize_aligned_axes(keys, data, aligned_axes)
     20     sanitized_axes = tuple([tuple(range(len(cube0_dims)))] * len(data))
     21 else:
     22     # Else, sanitize user-supplied aligned axes.
---> 23     sanitized_axes = _sanitize_user_aligned_axes(data, aligned_axes)
     25 return dict(zip(keys, sanitized_axes))

File ~/.virtualenvs/hinode-talk/lib/python3.13/site-packages/ndcube/utils/collection.py:43, in _sanitize_user_aligned_axes(data, aligned_axes)
     40 aligned_axes_error_message = ("aligned_axes must contain ints or "
     41                               "a tuple of ints for each element in data.")
     42 if isinstance(data[0].shape, tuple):
---> 43     cube0_dims = np.array(data[0].shape, dtype=object)[np.array(aligned_axes[0])]
     44 else:
     45     cube0_dims = data[0].shape[np.array(aligned_axes[0])]

KeyError: 0

Cadair avatar Jun 11 '25 08:06 Cadair

The solution is to use tuple(spice.aligned_axes.values()) which is obtuse.

Cadair avatar Jun 11 '25 08:06 Cadair

Adding this support sounds reasonable to me.

DanRyanIrish avatar Jun 11 '25 12:06 DanRyanIrish