У меня проблемы с доступом и назначением новых переменных для объекта, который я создал. В двух словах, я создал объект 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())