Как реализовать .tranpose () как .T (как в numpy) - PullRequest
0 голосов
/ 24 февраля 2020

Допустим, у меня есть следующий класс, содержащий массив Numpy a.

class MyClass():
    def __init__(self,a,b):
        self.a = a
        self.other_attributes = b
    def transpose(self):
        return MyClass(self.a.T,self.other_attributes)

Поскольку этот метод "транспонировать данные, оставьте без изменений" будет использоваться довольно часто, я бы хотел бы реализовать атрибут с коротким именем, например Numpy 's .T. Моя проблема в том, что я не знаю, как это сделать без вызова .transpose при инициализации, т. Е. Я хочу выполнять транспонирование только тогда, когда это требуется, вместо того, чтобы сохранять его в другом атрибуте. Это возможно?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Транспонирование - это просто просмотр данных, поэтому «вычисление» транспонирования при создании экземпляра на самом деле ничего не стоит.

In [11]: a = np.random.rand(2, 1)

In [12]: a
Out[12]: 
array([[0.22316214],
      [0.69797139]])

In [13]: b = a.T

In [14]: a[0] = 1

In [15]: b
Out[15]: array([[1.        , 0.69797139]])
0 голосов
/ 24 февраля 2020

Используйте property для вычисления атрибутов. Это также можно использовать для кэширования вычисленных результатов для последующего использования.

class MyClass():
    def __init__(self, a, b):
        self.a = a
        self.other_attributes = b

    @property
    def T(self):
        try:
            return self._cached_T  # attempt to read cached attribute
        except AttributeError:
            self._cached_T = self._transpose()  # compute and cache
            return self._cached_T

    def _transpose(self):
        return MyClass(self.a.T, self.other_attributes)

Поскольку Python 3.8, стандартная библиотека предоставляет functools.cached_property для автоматического кэширования вычисляемых атрибутов.

from functools import cached_property

class MyClass():
    def __init__(self, a, b):
        self.a = a
        self.other_attributes = b

    @cached_property
    def T(self):
        return self._transpose()

    def _transpose(self):
        return MyClass(self.a.T, self.other_attributes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...