Il est très pratique dans numpy d'utiliser l'attribut .T
Pour obtenir une version transposée d'un ndarray
. Cependant, il n'existe aucun moyen similaire d'obtenir la transposition du conjugué. La classe matricielle de Numpy a l'opérateur .H
, Mais pas ndarray. Parce que j'aime le code lisible et parce que je suis trop paresseux pour toujours écrire .conj().T
, je voudrais que la propriété .H
Soit toujours à ma disposition. Comment puis-je ajouter cette fonctionnalité? Est-il possible de l'ajouter pour qu'il soit disponible sans cervelle à chaque importation de numpy?
(Une question similaire pourrait être posée à propos de l'opérateur inverse .I
.)
En général, la difficulté de ce problème est que Numpy est une extension C, qui ne peut pas être patchée par un singe ... ou est-ce possible? Le module fruits interdits permet de faire cela, bien que cela ressemble un peu à jouer avec des couteaux.
Voici donc ce que j'ai fait:
Installez le paquet très simple fruits interdits
Déterminez le répertoire de personnalisation de l'utilisateur:
import site
print site.getusersitepackages()
Dans ce répertoire, modifiez usercustomize.py
pour inclure les éléments suivants:
from forbiddenfruit import curse
from numpy import ndarray
from numpy.linalg import inv
curse(ndarray,'H',property(fget=lambda A: A.conj().T))
curse(ndarray,'I',property(fget=lambda A: inv(A)))
Essaye-le:
python -c python -c "import numpy as np; A = np.array([[1,1j]]); print A; print A.H"
Résulte en:
[[ 1.+0.j 0.+1.j]]
[[ 1.-0.j]
[ 0.-1.j]]
Vous pouvez sous-classer l'objet ndarray
comme:
from numpy import ndarray
class myarray(ndarray):
@property
def H(self):
return self.conj().T
tel que:
a = np.random.random((3, 3)).view(myarray)
a.H
vous donnera le comportement souhaité.