Конъюгатный оператор транспонирования ".H" в numpy

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

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

Ответ 1

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

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

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

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

    import site
    print site.getusersitepackages()
    
  • В этом каталоге отредактируйте 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)))
    
  • Проверьте это:

    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]]
    

Ответ 2

Вы можете ndarray подкласс объекта 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

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