【发布时间】:2020-03-26 22:50:59
【问题描述】:
我有一个三维数据集,其中第一个维度给出变量的类型,第二个和第三个维度是空间索引。我试图通过创建包含数据的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 中实现的,所以你不能有充分的理由覆盖它。我认为 numpy 设置这个限制是可以接受的,因为它可能会破坏任意数量的利用
T属性的函数,然后你就会有一个损坏的 numpy 数组。是什么阻止您使用T_?或temp? -
T不是实际属性。它是一个描述符,类似于检索新对象的属性。 -
试试
@property def T(self): return self[8,:,:] -
您不能将新属性写入数组,因为它没有
__dict__。在 Python 中,您可以使用__slots__进行模拟
标签: python numpy subclassing