Sie können auf https://numpy.org/doc/stable/user/basics.subclassing.html#module-numpy.doc.subclassing (offiziell) verweisen.
Unten finden Sie ein einfaches Implementierungsbeispiel.
class Element:
def __init__(self, r, c):
self.r = r
self.c = c
def __repr__(self):
return f'Element({self.r},{self.c})'
Angenommen, Sie möchten das Element (r, c) in der Zeile r und der Spalte c der obigen selbst erstellten Klasse als Element eines 2D-ndarrays verwenden.
Erstellen Sie die MyNdarray-Klasse, indem Sie np.ndarray wie folgt erben.
import numpy as np
class MyNdarray(np.ndarray):
def __new__(cls, dimension):
shape = (dimension, dimension)
return super().__new__(cls, shape, dtype=Element)
def __init__(self, dimension):
for r in range(dimension):
for c in range(dimension):
self[r, c] = Element(r, c)
Erstellen Sie eine numpy ndarray-Instanz mit der Form (dimension * dimension) mit __new__
und führen Sie die erste Operation (Konstruktor) mit __init__
aus.
a = MyNdarray(3)
>> MyNdarray([[Element(0,0), Element(0,1), Element(0,2)],
[Element(1,0), Element(1,1), Element(1,2)],
[Element(2,0), Element(2,1), Element(2,2)]], dtype=object)
a[0, 0]
>> Element(0,0)
Es wäre schön, die Slicing-Operation und die Translokationsfunktion von ndarray so nutzen zu können, wie sie sind.
a[:, 0:2]
>> MyNdarray([[Element(0,0), Element(0,1)],
[Element(1,0), Element(1,1)],
[Element(2,0), Element(2,1)]], dtype=object)
a.T
>> MyNdarray([[Element(0,0), Element(1,0), Element(2,0)],
[Element(0,1), Element(1,1), Element(2,1)],
[Element(0,2), Element(1,2), Element(2,2)]], dtype=object)
Wenn Sie der Klasse "MyNdarray" ein Attribut hinzufügen möchten, verwenden Sie die Funktion "array_finalize".
import numpy as np
class MyNdarray(np.ndarray):
def __new__(cls, dimension):
shape = (dimension, dimension)
obj = super().__new__(cls, shape, dtype=Element)
obj.dimension = dimension
return obj
def __init__(self, dimension):
for r in range(dimension):
for c in range(dimension):
self[r, c] = Element(r, c)
def __array_finalize__(self, obj):
if obj is None:
return
self.dimension = getattr(obj, 'dimension', None)
a = MyNdarray(3)
a.dimension
>>> 3
Recommended Posts