基于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
是否是一个好的实践…)当我试图创建一个新的数组时,我得到了这样的结果:
我也试过:
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
有问题吗?在
这里有几个问题。在
当subclassing ^{} 时,应该覆盖}。你的台词
__new__()
,而不是{实际上用参数2调用
numpy.ndarray.__new__()
,与its signature不兼容。分配给
self
在这里完全没有任何作用。它只创建一个对象并使本地名称self
指向该对象。一旦函数退出,所有本地名称都将被删除。Python中的赋值既不创建变量,也不alter objects;它只是将一个现有对象赋给一个名称。即使在解决了最后两个问题时,对称矩阵类也无法按预期工作。为了确保矩阵总是对称的,你需要重写很多方法。
(arr + arr.T)/2.0 - np.diag(np.diag(arr))
很可能不是你想要的。对角线上总是有零。你可能想要(arr + arr.T)/2.0
。相关问题 更多 >
编程相关推荐