web-dev-qa-db-fra.com

Opérateur de transposition conjugué ".H" dans numpy

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.)

20
benpro

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:

  1. Installez le paquet très simple fruits interdits

  2. Déterminez le répertoire de personnalisation de l'utilisateur:

    import site
    print site.getusersitepackages()
    
  3. 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)))
    
  4. 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]]
    
11
benpro

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é.

13