python: utilisez votre propre classe pour numpy ndarray

Vous pouvez vous référer à https://numpy.org/doc/stable/user/basics.subclassing.html#module-numpy.doc.subclassing (officiel).

Voici un exemple de mise en œuvre simple.

class Element:
    def __init__(self, r, c):
        self.r = r
        self.c = c
        
    def __repr__(self):
        return f'Element({self.r},{self.c})'

Supposons que vous souhaitiez utiliser Element (r, c) dans la ligne r et la colonne c de la classe self-made ci-dessus en tant qu'élément d'un ndarray 2D.

Créez la classe MyNdarray en héritant de np.ndarray comme suit.

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)

Créez une instance numpy ndarray avec une forme de (dimension * dimension) avec __new__, et effectuez l'opération initiale (constructeur) avec __init__.

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)

Ce serait bien de pouvoir utiliser l'opération de découpage et la fonction de translocation de ndarray telles quelles.

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)


De plus, si vous souhaitez ajouter un attribut à la classe MyNdarray, utilisez la fonction __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: utilisez votre propre classe pour numpy ndarray
Utilisez facilement vos propres fonctions en Python
[Python] Implémentez votre propre classe de type liste à l'aide de collections.UserList
N'utilisez pas readlines () dans votre instruction Python for!
Utilisez CASA Toolkit dans votre propre environnement Python
[Road to Intermediate Python] Définissez dans votre propre classe
[Python] Créez votre propre bot LINE
[Python] journalisation dans votre propre module
[Introduction à Python] <numpy ndarray> [modifier le 22/02/2020]
Ensuite, utilisez Python (Flask) pour Heroku!
Web scraping pour les débutants en Python (4) -1
Créez votre propre classe de structure graphique et son dessin avec python
Essayez docker: créez votre propre image de conteneur pour une application Web Python
[Introduction à Python] Comment utiliser la classe en Python?
Créez vos propres commandes Linux en Python
Utiliser DeepL avec python (pour la traduction d'articles)
[LLDB] Créez votre propre commande avec Python
[Python] Empaquetez et distribuez vos propres modules
Créez votre propre PC pour un apprentissage en profondeur
Utilisons le langage de script pour une vie confortable en C ++ 4 - Utilisons la propre bibliothèque de C ++ à partir du langage de script -
[Python] Enregistrez votre propre bibliothèque dans PyPI
[Python] Organisation de l'utilisation des instructions
Jusqu'à ce que vous installiez votre propre bibliothèque Python
Utilisez Numpy
Comment utiliser "deque" pour les données Python
[Python] Il était très pratique d'utiliser la classe Python pour le programme ROS.
Obtenez votre propre adresse IP en Python
[Python] matplotlib: Formatez le diagramme de votre mémoire
Utilisez Logger avec Python pour le moment
Créez rapidement votre propre module avec setuptools (python)
Python: préparez un sérialiseur pour l'instance de classe:
Importez vos propres modules avec le développement Python de Grasshopper
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Comment rendre le Python des débutants plus rapide [numpy]
30/10/2016 else pour Python3> pour:
Mon Numpy (Python)
python [pour moi]
"Kanrika" la classe python
Les bases de #Python (#Numpy 1/2)
Les bases de #Python (#Numpy 2/2)
[Numpy] Shuffle ndarray
classe python, instance
Principes de base de Python #Numpy
Les bases de #Python (classe)
[Python] Mémo Numpy
[Pour les débutants] Comment utiliser la commande say avec python!
Web scraping pour les débutants en Python (1) Version améliorée
Mémo pour créer votre propre Box avec le Python de Pepper
Faire de l'application Python CUI une application pour Mac
[Introduction à l'application Udemy Python3 +] 66. Création de votre propre exception
Convertir le tableau NumPy "ndarray" en lilt en Python [tolist ()]
Prenez votre propre utilisation maximale de la mémoire sous Linux et Python
Créez votre propre stéréogramme aléatoire (RDS) en Python.
Essayez d'améliorer votre propre quiz d'introduction avec Python
[Python] 2 Créez une carte risque-rendement pour votre portefeuille d'actifs
Utiliser Python installé par pyenv pour l'environnement d'exécution PL / Python
Utilisez urlparse.urljoin au lieu de os.path.join pour les jointures d'URL Python
[Blender x Python] Créez votre propre fonction et résumé jusqu'à présent