Python: Verwenden Sie Ihre eigene Klasse für Numpy Ndarray

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

Python: Verwenden Sie Ihre eigene Klasse für Numpy Ndarray
Verwenden Sie einfach Ihre eigenen Funktionen in Python
[Python] Implementieren Sie Ihre eigene listenähnliche Klasse mit collection.UserList
Verwenden Sie in Ihrem Python keine readlines () für Anweisungen!
Verwenden Sie CASA Toolkit in Ihrer eigenen Python-Umgebung
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
[Python] Erstelle deinen eigenen LINE-Bot
[Python] Anmelden Ihres eigenen Moduls
[Einführung in Python] <numpy ndarray> [edit: 2020/02/22]
Verwenden Sie als nächstes Python (Flask) für Heroku!
Web Scraping für Anfänger in Python (4) -1
Erstellen Sie Ihre eigene Diagrammstrukturklasse und deren Zeichnung mit Python
Docker ausprobieren: Erstellen Sie Ihr eigenes Container-Image für eine Python-Web-App
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Erstellen Sie Ihre eigenen Linux-Befehle in Python
Verwenden Sie DeepL mit Python (für die Artikelübersetzung)
[LLDB] Erstellen Sie Ihren eigenen Befehl mit Python
[Python] Packen und verteilen Sie Ihre eigenen Module
Machen Sie Ihren eigenen PC für tiefes Lernen
Verwenden wir die Skriptsprache für ein komfortables C ++ - Leben. 4 - Verwenden wir die eigene C ++ - Bibliothek aus der Skriptsprache. -
[Python] Registrieren Sie Ihre eigene Bibliothek in PyPI
[Python] Organisieren der Verwendung für Anweisungen
Bis Sie Ihre eigene Python-Bibliothek installieren
Verwenden Sie Numpy
Verwendung von "deque" für Python-Daten
[Python] Es war sehr praktisch, die Python-Klasse für das ROS-Programm zu verwenden.
Holen Sie sich Ihre eigene IP-Adresse in Python
[Python] matplotlib: Formatieren Sie das Diagramm für Ihre Dissertation
Verwenden Sie vorerst Logger mit Python
Erstellen Sie schnell Ihr eigenes Modul mit setuptools (Python)
Python: Bereiten Sie einen Serializer für die Klasseninstanz vor:
Importieren Sie Ihre eigenen Module mit der Python-Entwicklung von Grasshopper
Wrap C ++ mit Cython zur Verwendung von Python
Wie man Python für Anfänger schneller macht [numpy]
2016-10-30 sonst für Python3> für:
Mein Numpy (Python)
Python [für mich]
"Kanrika" die Python-Klasse
# Python-Grundlagen (#Numpy 1/2)
# Python-Grundlagen (#Numpy 2/2)
[Numpy] Shuffle ndarray
Python-Klasse, Instanz
Python #Numpy Basics
# Python-Grundlagen (Klasse)
[Python] Numpy Memo
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
Web Scraping für Anfänger in Python (1) Verbesserte Version
Memo zum Erstellen einer eigenen Box mit Peppers Python
Machen Sie die Python CUI-Anwendung zu einer App für Mac
[Einführung in die Udemy Python3 + -Anwendung] 66. Erstellen einer eigenen Ausnahme
Konvertieren Sie das NumPy-Array "ndarray" in Python [tolist ()]
Nehmen Sie Ihre eigene maximale Speichernutzung in Linux & Python
Erstellen Sie Ihr eigenes Random Dot Stereogram (RDS) in Python.
Versuchen Sie, Ihr eigenes Intro-Quiz mit Python zu verbessern
[Python] 2 Erstellen Sie eine Risiko-Rendite-Karte für Ihr Asset-Portfolio
Verwenden Sie Python, das von pyenv für die PL / Python-Ausführungsumgebung installiert wurde
Verwenden Sie für Python-URL-Verknüpfungen urlparse.urljoin anstelle von os.path.join
[Blender x Python] Erstellen Sie Ihre eigene Funktion und Zusammenfassung