2014-11-14 18 views
10

È molto conveniente in numpy utilizzare l'attributo .T per ottenere una versione trasposta di un ndarray. Tuttavia, non esiste un modo simile per ottenere la trasposizione coniugata. La classe matrix di Numpy ha l'operatore .H, ma non narray. Poiché mi piace il codice leggibile e poiché sono troppo pigro per scrivere sempre .conj().T, desidero che la proprietà sia sempre disponibile per me. Come posso aggiungere questa funzione? È possibile aggiungerlo in modo che sia disponibile senza cervello ogni volta che viene importato il numpy?Operatore di trasposizione coniugato ".H" in numpy

(Una domanda simile non poteva in stato chiesto l'operatore .I inversa.)

risposta

6

I In generale, la difficoltà in questo problema è che Numpy è un'estensione C, che non può essere rattoppata con scimmia ... o può? Il modulo forbiddenfruit consente di farlo, anche se sembra un po 'come giocare con i coltelli.

Così qui è quello che ho fatto:

  1. Installare il pacchetto molto semplice forbiddenfruit

  2. Determinare la directory di personalizzazione da parte dell'utente:

    import site 
    print site.getusersitepackages() 
    
  3. In questa directory, modificare usercustomize.py per includere quanto segue:

    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. prova è:

    python -c python -c "import numpy as np; A = np.array([[1,1j]]); print A; print A.H" 
    

    risultati in:

    [[ 1.+0.j 0.+1.j]] 
    [[ 1.-0.j] 
    [ 0.-1.j]] 
    
8

È possibile creare una sottoclasse dell'oggetto ndarray come:

from numpy import ndarray 

class myarray(ndarray):  
    @property 
    def H(self): 
     return self.conj().T 

tale che:

a = np.random.random((3, 3)).view(myarray) 
a.H 

vi darà il comportamento desiderato ...

+0

Grazie, ma speravo in una soluzione di tipo scimmia patch in cui ho potuto ancora utilizzare ndarray ovunque, per esempio 'A = np.random.randn (3,3) + 1j * np.random.randn (3,3); B = AHdot (A) ' – benpro

+0

@benpro Vedo ... ma [questo sarebbe più complicato] (http://docs.scipy.org/doc/numpy/user/basics.subclassing.html#implications-for- sottoclassi) –