несколько представлений одних и тех же данных в классе Python - PullRequest
0 голосов
/ 24 апреля 2018

У меня проблемы с доступом и назначением новых переменных для объекта, который я создал. В двух словах, я создал объект Theta, который может содержать несколько матриц (numpy), и мне нужно, чтобы этот объект был доступен как в формате словаря матриц, так и в формате векторной строки.

Например, когда я выполняю операции линейной алгебры (приложение нейронной сети), я могу очень просто получать доступ к отдельным матрицам и выполнять операции. Однако эти матрицы проще всего передать другим функциям в векторном формате строки. У меня есть другая функция в классе, которая принимает вектор-строку в качестве входных данных и повторно создает все матрицы, которые я для краткости опускаю.

Моя проблема в том, что я хотел бы получить доступ и назначить новые значения, просто редактируя вектор строки, без необходимости писать новую функцию в классе, которая указывает индекс для индекса, а затем обновленные значения. Короче говоря, у меня есть два представления одних и тех же данных, и я хотел бы иметь возможность назначать новые значения одному из представлений, а затем другое представление также автоматически обновляется.

Я понимаю, что, возможно, смогу переделать весь класс, чтобы по-разному его спроектировать, чтобы избежать этих проблем, но в целом я подумал, что это хороший вопрос. Спасибо!

import numpy as np

class Theta(object):
    def __init__(self, nn_specs, code = 'zeros'):
        self.specs = nn_specs
        self.matrices = {}
        if code == 'zeros':
            Theta.set_zeros(self)
        elif code == 'random':
            print('...setting random theta')
            Theta.set_random(self)

    def set_zeros(self):
        for i in range(len(self.specs)-1):
            self.matrices[i] = np.zeros((self.specs[i+1], (self.specs[i]+1)))

    def set_random(self, eps = 0.1):
        for i in range(len(self.specs)-1):
            self.matrices[i] = (np.random.rand(self.specs[i+1], (self.specs[i]+1)) * 2 * eps) - eps

    def get_flat(self):
        for i_theta in range(len(self.matrices)):
            if i_theta == 0:
                self.flat = self.matrices[i_theta].flatten()
            else:
                self.flat = np.concatenate((self.flat, self.matrices[i_theta].flatten()))
        return self.flat

test_theta = Theta((2,3,1), 'random')

print(test_theta.get_flat())

test_theta.get_flat()[2] = 3
#I AM NEEDING THIS TO CHANGE, with the third value being 3
print(test_theta.get_flat())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...