Using your example and refering to Simple example - adding an extra attribute to ndarray, something you can do is
class YourArray(np.ndarray):
def __new__(cls, input_array, your_new_attr=None):
obj = np.asarray(input_array).view(cls)
obj.your_new_attr = your_new_attr
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.your_new_attr = getattr(obj, 'your_new_attr', None)
and then
>>> x = np.array([1, 2, 4])
>>> x_ = YourArray(x)
>>> x_.your_new_attr = 2
>>> x_.your_new_attr
2
or directly at instantiation
>>> # x_ = YourArray([1, 2, 4], your_new_attr=3) works as well
>>> x_ = YourArray(x, your_new_attr=3)
>>> x_.your_new_attr
3