【问题标题】:Add an attribute to a Numpy array in runtime在运行时向 Numpy 数组添加属性
【发布时间】:2021-08-03 04:29:24
【问题描述】:

我正在尝试使用 setattr 将属性添加到 Numpy ndarray,但出现错误:

import numpy as np

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

AttributeError: numpy.ndarray 对象没有属性 new_attr

如何向 Numpy ndarray 添加新属性?

【问题讨论】:

  • 你不能,它是用C实现的。尝试继承它
  • 为什么要为其添加新属性?
  • 不能,类型不允许。
  • @LucasNg 我需要大量的矩阵逆矩阵,而 Matrix_name.I 是一种特别方便的方法,不幸的是 numpy.matrix 可能会从未来的版本中删除[1],因此从 np.ndarray 创建一个子类我(逆)属性是唯一的选择。 [1]numpy.org/doc/stable/reference/generated/numpy.matrix.html

标签: python numpy numpy-ndarray


【解决方案1】:

使用您的示例并引用Simple example - adding an extra attribute to 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】:

    metadata 类型的 numpy 有帮助吗?它允许设置一个新的 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:你是对的:从技术上讲,元数据附加到 dtype(反过来,它附加到数组)。我同意,创建自己的 dtype 只是为了附加元数据可能很笨拙。
    • @DeepSpace: 不。它将数据附加到 dtype 上,这与 type 不同。
    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2011-12-10
    • 2013-01-21
    • 2019-02-15
    相关资源
    最近更新 更多