在运行时向NumPy数组添加属性

6
我尝试使用setattr将属性添加到Numpy ndarray中,但是出现了错误:
import numpy as np

x = np.array([1, 2, 4])
setattr(x, 'new_attr', 1)

如何向NumPy的ndarray对象添加新属性?
出现错误:AttributeError: numpy.ndarray对象没有new_attr属性。

你不能这样做,因为它是用C实现的。尝试进行子类化。 - DeepSpace
你为什么想要给它添加一个新属性? - Lucas Ng
你不能这样做,类型不允许。 - juanpa.arrivillaga
@LucasNg 我需要大量的矩阵求逆和 Matrix_name.I 是一个特别方便的方法,不幸的是 numpy.matrix 可能会在未来版本中被移除[1],因此创建一个从 np.ndarray 派生出来的具有 I(逆)属性的子类是唯一的选择。[1] https://numpy.org/doc/stable/reference/generated/numpy.matrix.html - Mohit Burkule
2个回答

4

参考简单示例 - 将额外的属性添加到ndarray中,您可以使用您的示例进行操作。

class YourArray(np.ndarray):

    def __new__(cls, input_array, your_new_attr=None):        
        obj = np.asarray(input_array).view(cls)
        obj.your_new_attr = your_new_attr
        return obj

    def __array_finalize__(self, obj):
        if obj is None: return
        self.your_new_attr = getattr(obj, 'your_new_attr', None)

然后

>>> x = np.array([1, 2, 4])
>>> x_ = YourArray(x)
>>> x_.your_new_attr = 2
>>> x_.your_new_attr
2

或者直接在实例化时进行

>>> # x_ = YourArray([1, 2, 4], your_new_attr=3) works as well
>>> x_ = YourArray(x, your_new_attr=3)
>>> x_.your_new_attr
3

2
“numpy中的metadata类型能帮上忙吗?它允许设置一个新的dtype(基于现有的dtype),您可以在其中附加键值对。”
“对于您的数组,这将是:”
dt = np.dtype(int, metadata={"new_attr": 1})
x = np.array([1, 2, 4], dtype=dt)
print(x.dtype.metadata)


这是否会将属性添加到类型 (np.array) 而非实例(x)? - DeepSpace
@DeepSpace:你说得对:从技术上讲,元数据附加在dtype上(反过来又附加在数组上)。我同意,为了附加元数据而创建自己的dtype可能会很麻烦。 - Tobias Windisch
2
@DeepSpace:不是的。它将数据附加到dtype,这与类型不同。 - user2357112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接