Конъюгатный оператор транспонирования ".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
даст вам желаемое поведение.