2014-11-14 2 views
10

В numpy очень удобно использовать атрибут .T, чтобы получить транспонированную версию ndarray. Однако аналогичного способа получения сопряженного транспонирования нет. Матричный класс Numpy имеет оператор .H, но не ndarray. Потому что мне нравится читаемый код, а потому, что я ленив, чтобы всегда писать .conj().T, я бы хотел, чтобы свойство .H всегда было доступно мне. Как добавить эту функцию? Можно ли добавить его так, чтобы он бездумно был доступен каждый раз, когда импортируется numpy?Конъюгатный оператор транспонирования «.H» в numpy

(Аналогичный вопрос можно путем вопрос о .I обратном операторе.)

ответ

6

I n вообще, трудность в этой проблеме заключается в том, что Numpy является C-расширением, которое не может быть обезврежено обезьяной ... или может? Модуль forbiddenfruit позволяет делать это, хотя он немного напоминает игру с ножами.

Так вот что я сделал:

  1. Установите очень простой forbiddenfruit пакет

  2. Определить каталог пользователя настройки:

    import site 
    print site.getusersitepackages() 
    
  3. В этом каталоге, редактировать usercustomize.py, чтобы включить следующее:

    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. Попробуй:

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

    Результаты в:

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

Вы можете подкласс ndarray объекта как:

from numpy import ndarray 

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

, что:

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

даст вам желаемое поведение ...

+0

Спасибо, но я надеялся на тип обезьяны латание решения, где я все еще мог использовать ndarray везде, например, 'A = np.random.randn (3,3) + 1j * np.random.randn (3,3); B = AHdot (A) ' – benpro

+0

@benpro Я вижу ... но [это было бы сложнее] (http://docs.scipy.org/doc/numpy/user/basics.subclassing.html#implications-for- подклассы) –

Смежные вопросы