【问题标题】:Add method to numpy object将方法添加到 numpy 对象
【发布时间】:2022-01-01 11:35:53
【问题描述】:

我有一个简单的问题。我想缩短克罗内克积的表达式

a=np.matrix('1 0; 0 1')
b=np.matrix('1 0; 0 1')
C=np.kron(a,b)

这样的事情

C=a.k(b)

我一直在鞭打谷歌一段时间,但我并没有找到解决这个问题的方法。 我知道有一些解决方法可以很好地工作,但我想了解如何将函数添加到这样的 numpy 对象。或任何物体。我想学,不想学。

有什么想法吗?提前致谢!

【问题讨论】:

  • 虽然您提到不想创建新功能,但创建一个继承矩阵所有功能的新类不是最直接的吗?
  • 我同意。创建一个继承自矩阵并拥有这个额外方法的类听起来比猴子修补现有类的方法要容易得多。
  • k = np.kron 怎么样,然后你可以打电话给k(a, b)
  • 大家好。我意识到我可以创建一个新课程或捷径,但我想这样做是为了理解。我不能在此代码中通过此函数扩展 numpy 矩阵,并且仅适用于此代码的生命周期吗?我不明白我会如何这样做,这让我很困扰。

标签: python python-class


【解决方案1】:

如果您不想对 Matrix 进行子类化,您可以在运行时对您的方法进行猴子补丁。这意味着您只需创建要添加到矩阵类的函数,然后将其分配给您希望方法名称为的类的属性名称,在本例中为k。这是可行的,因为在 Python 中,函数是第一类对象,这意味着您可以将它们分配给变量(或类属性),这相当于在实际类中定义函数。

def kron(self, other):
    return np.kron(self, other)
    
np.matrix.k = kron

之后,您可以调用:

>>> a.k(b)
matrix([[1, 0, 0, 0],
        [0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]])

您可以在此处阅读有关猴子补丁的更多信息:What is monkey patching?

【讨论】:

  • 和你下面做的一样。
  • 但它不依赖于我必须放入的“setattr()”函数。它看起来是一个更好的解决方案,即使它是一样的。我不知道“setattr()”是做什么的。你的帖子很明显。
  • setattr 正在设置属性。它与我的解决方案对 = 符号所做的完全一样。事实上,np.matrix.k = kron 在后台调用了setattr(np.matrix, 'k', kron)。您可以将其解读为:“将函数 kron 设置为 np.matrix 的属性并将其命名为 k。”
  • 您好。我在之前的回答中遇到了一个问题,我把它放在下面,因为我无法在评论中格式化。
【解决方案2】:

我找到了答案

a=np.matrix('1 0; 0 1')
b=np.matrix('1 0; 0 1')

def k(self, b): # Have to add self since this will become a method
    return np.kron(self,b)
setattr(np.matrix, 'k', k)

print(a.k(b))

给我正确的结果。

帮助我解决此问题的链接: https://mgarod.medium.com/dynamically-add-a-method-to-a-class-in-python-c49204b85bd6

【讨论】:

  • 这不是答案。最好将其作为一个新问题发布,并附上指向该问题的链接以获取上下文。
  • 是的,我会这样做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多