Я хотел бы знать, как можно распространять пользовательские атрибуты массивов numpy, даже когда массив проходит через такие функции, как np.fromfunction
.
Например, мой класс ExampleTensor
определяет атрибут attr
который по умолчанию установлен в 1.
import numpy as np
class ExampleTensor(np.ndarray):
def __new__(cls, input_array):
return np.asarray(input_array).view(cls)
def __array_finalize__(self, obj) -> None:
if obj is None: return
# This attribute should be maintained!
self.attr = getattr(obj, 'attr', 1)
Нарезка и основные операции между экземплярами ExampleTensor
будут поддерживать атрибуты, но использование других функций numpy не будет (вероятно, потому, что они создают обычные массивы numpy вместо ExampleTensors). Мой вопрос: существует ли решение, которое сохраняется в пользовательских атрибутах, когда обычный массив numpy создается из экземпляров массивов с подклассами numpy?
Пример для воспроизведения проблемы:
ex1 = ExampleTensor([[3, 4],[5, 6]])
ex1.attr = "some val"
print(ex1[0].attr) # correctly outputs "some val"
print((ex1+ex1).attr) # correctly outputs "some val"
np.sum([ex1, ex1], axis=0).attr # Attribute Error: 'numpy.ndarray' object has no attribute 'attr'