我有一个三维数据集,其中第一维给出变量的类型,第二维和第三维是空间索引。我正在尝试通过创建包含数据的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覆盖此属性?
[我同意C.Nivs,不要弄混numpy的内置函数,尤其是不要与将被诸如转置之类的所有其他函数重用的基本函数混在一起。
我会通过不重载numpy数组但将其包装到一个类中来解决,因此两者都可以工作:
class Temp():
def __init__(self, data, Temperature):
self.data = np.asarray(data)
self.T = Temperature
Temperature = [1,2,3]
data = np.arange(0,10)
df = Temp(data, Temperature)
df.T, df.data.T
([1, 2, 3], array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))