Numpy:创建对称矩阵类

2024-10-04 01:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

基于this answer,我在python中用numpy为对称矩阵编写了一个简单的类,但是我遇到了(可能是一个非常简单的)问题。这是有问题的代码:

import numpy as np

 class SyMatrix(np.ndarray):
    def __init__(self, arr):
        self = (arr + arr.T)/2.0 - np.diag(np.diag(arr)) 
    def __setitem__(self,(i,j), val):
        np.ndarray.__setitem__(self, (i, j), value)
        np.ndarray.__setitem__(self, (j, i), value)

除了这种感觉之外(我不知道赋值给self是否是一个好的实践…)当我试图创建一个新的数组时,我得到了这样的结果:

^{pr2}$

我也试过:

import numpy as np

 class SyMatrix(np.ndarray):
    def __init__(self, n):
        self =  np.zeros(shape = (n,n)).view(SyMatrix)  
    def __setitem__(self,(i,j), val):
        np.ndarray.__setitem__(self, (i, j), value)
        np.ndarray.__setitem__(self, (j, i), value)

然后我得到:

>>> foo = SyMatrix(2)
>>> foo
SyMatrix([  6.93581448e-310,   2.09933710e-316])
>>> 

其中我期望有一个shape=(2,2)的数组。正确的方法是什么?分配给self有问题吗?在


Tags: importselfnumpyinitvaluedefasnp
1条回答
网友
1楼 · 发布于 2024-10-04 01:34:02

这里有几个问题。在

  1. subclassing ^{}时,应该覆盖__new__(),而不是{}。你的台词

    foo = SyMatrix(2)
    

    实际上用参数2调用numpy.ndarray.__new__(),与its signature不兼容。

  2. 分配给self在这里完全没有任何作用。它只创建一个对象并使本地名称self指向该对象。一旦函数退出,所有本地名称都将被删除。Python中的赋值既不创建变量,也不alter objects;它只是将一个现有对象赋给一个名称。

  3. 即使在解决了最后两个问题时,对称矩阵类也无法按预期工作。为了确保矩阵总是对称的,你需要重写很多方法。

  4. (arr + arr.T)/2.0 - np.diag(np.diag(arr))很可能不是你想要的。对角线上总是有零。你可能想要(arr + arr.T)/2.0

相关问题 更多 >