У меня есть трехмерный набор данных, где 1-е измерение дает тип переменной, а 2-е и 3-е измерения - пространственные индексы. Я пытаюсь сделать эти данные более удобными для пользователя, создав подкласс ndarray
, содержащий данные, но с атрибутами, которые имеют разумные имена, которые указывают на соответствующее измерение переменной. Одним из типов переменных является температура, которую я хотел бы представить с атрибутом .T
. Я пытаюсь установить его так:
self.T = self[8,:,:]
Однако это конфликтует с базовым атрибутом numpy для транспонирования массива. Обычно переопределение атрибута класса тривиально, однако в этом случае я получаю исключение, когда пытаюсь переписать атрибут. Ниже приведен минимальный пример той же проблемы:
import numpy as np
class foo(np.ndarray):
def __new__(cls, input_array):
obj = np.asarray(input_array).view(cls)
obj.T = 100.0
return obj
foo([1,2,3,4])
приводит к:
Traceback (most recent call last):
File "tmp.py", line 9, in <module>
foo([1,2,3,4])
File "tmp.py", line 6, in __new__
obj.T = 100.0
AttributeError: attribute 'T' of 'numpy.ndarray' objects is not writable
Я пытался использовать setattr(obj, 'T', 100.0)
для установки атрибута, но результат тот же .
Очевидно, я мог бы просто сдаться и назвать свой атрибут .temperature
или что-то еще. Однако .T
будет гораздо более красноречивым для последующих математических выражений, которые будут сделаны с этими объектами данных. Как я могу заставить python / numpy переопределить этот атрибут?