Original problem description
The problem arises when I implement some machine learning algorithm with numpy
. I want some new class ludmo
which works the same as numpy.ndarray
, but with a few more properties. For example, with a new property ludmo.foo
. I've tried several methods below, but none is satisfactory.
1. Wrapper
First I created a wrapper class for numpy.ndarray
, as
import numpy as np
class ludmo(object):
def __init__(self)
self.foo = None
self.data = np.array([])
But when I use some function (in scikit-learn
which I cannot modify) to manipulate a list of np.ndarray
instance, I have to first extract all data
field of each ludmo
object and collect them into a list. After that the list is sorted and I lost the correspondence between the data
and original ludmo
objects.
2. Inheritance
Then I tried to make ludmo
a subclass of numpy.ndarray
, as
import numpy as np
class ludmo(np.ndarray):
def __init__(self, shape, dtype=float, buffer=None, offset=0, strides=None, order=None)
super().__init__(shape, dtype, buffer, offset, strides, order)
self.foo = None
But another problem arises then: the most common way to create a numpy.ndarray
object is numpy.array(some_list)
, which returns a numpy.ndarray
object, and I have to convert it to a ludmo
object. But till now I found no good way to do this; simply changing the __class__
attribute will result in an error.
I'm new to Python and numpy, so there must be some elegant way that I don't know. Any advice is appreciated.
It's better if anyone can give an generic solution, which not only applies to the numpy.ndarray
class but also all kinds of classes.