У меня есть класс, представляющий математический тензор. Тензор в классе хранится в виде одного списка, а не списков внутри другого списка. Это означает, что [[1, 2, 3], [4, 5, 6]]
будет храниться как [1, 2, 3, 4, 5, 6]
.
Я сделал функцию __setitem__()
и функцию для обработки взятия фрагментов этого тензора, пока он в формате одного списка. Например, slice(1, None, None)
станет slice(3, None, None)
для списка, упомянутого выше. Однако, когда я назначаю этому срезу новое значение, исходный тензор не обновляется.
Вот как выглядит упрощенный код
class Tensor:
def __init__(self, tensor):
self.tensor = tensor # Here I would flatten it, but for now imagine it's already flattened.
def __setitem__(self, slices, value):
slices = [slices]
temp_tensor = self.tensor # any changes to temp_tensor should also change self.tensor.
for s in slices: # Here I would call self.slices_to_index(), but this is to keep the code simple.
temp_tensor = temp_tensor[slice]
temp_tensor = value # In my mind, this should have also changed self.tensor, but it hasn't.
Может быть, я просто глуп и могу не понимаю, почему это не работает. Может быть, мои настоящие вопросы не просто «почему это не работает?» но также «есть ли лучший способ сделать это?». Спасибо за любую помощь, которую вы можете мне оказать.
ПРИМЕЧАНИЯ:
Каждое «измерение» списка должно иметь одинаковую форму, поэтому [[1, 2, 3], [4, 5]]
не допускается.
Этот код значительно упрощен, так как есть много других вспомогательных функций и тому подобное.
в __init__()
Я бы сгладил список, но, как я только что сказал, для простоты я оставил это, наряду с self.slice_to_index()
.