Python Numpy:创建对称矩阵类
基于,我用numpy在python中为对称矩阵编写了一个简单的类,但我遇到了(可能是一个非常简单的)问题。这是有问题的代码:Python Numpy:创建对称矩阵类,python,arrays,numpy,Python,Arrays,Numpy,基于,我用numpy在python中为对称矩阵编写了一个简单的类,但我遇到了(可能是一个非常简单的)问题。这是有问题的代码: 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.nd
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
是否是一种好的做法…),当我尝试创建一个新数组时,我得到以下结果:
>>> foo = SyMatrix( np.zeros(shape = (2,2)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: only length-1 arrays can be converted to Python scalars
然后我得到:
>>> foo = SyMatrix(2)
>>> foo
SyMatrix([ 6.93581448e-310, 2.09933710e-316])
>>>
其中,我希望数组的形状为
shape=(2,2)
。做我想做的事的正确方法是什么?分配给self
有问题吗?这里有一些问题
\uuuuu new\uuuuuu()
,而不是\uuuuuuu init\uuuuuu()
。你的线路
foo = SyMatrix(2)
实际使用参数2调用numpy.ndarray.\uuu new\uuuu()
,与不兼容self
在这里完全不起作用。它只是创建一个对象,并使本地名称self
指向该对象。一旦函数退出,所有本地名称都将被删除。Python中的赋值既不创建变量,也不改变对象;它只是将一个现有对象指定给一个名称(arr+arr.T)/2.0-np.diag(np.diag(arr))
很可能不是您想要的。对角线上总是有零。您可能需要(arr+arr.T)/2.0
这里有几个问题
\uuuuu new\uuuuuu()
,而不是\uuuuuuu init\uuuuuu()
。你的线路
foo = SyMatrix(2)
实际使用参数2调用numpy.ndarray.\uuu new\uuuu()
,与不兼容self
在这里完全不起作用。它只是创建一个对象,并使本地名称self
指向该对象。一旦函数退出,所有本地名称都将被删除。Python中的赋值既不创建变量,也不改变对象;它只是将一个现有对象指定给一个名称(arr+arr.T)/2.0-np.diag(np.diag(arr))
很可能不是您想要的。对角线上总是有零。您可能需要(arr+arr.T)/2.0
分配给
self
在这里基本上没有任何作用。它只是用一个不同的对象覆盖本地名self
。@Sven:这是答案,发布它!分配给self
在这里基本上没有任何作用。它只是用一个不同的对象覆盖本地名self
。@Sven:这是答案,发布它!谢谢你的快速回答。第(4)点是有意的,我需要矩阵有一个零对角线-我只是复制了代码,忘了删除它。谢谢你的更正,我在阅读了你的答案后发现:谢谢你的快速回答。第(4)点是有意的,我需要矩阵有一个零对角线-我只是复制了代码,忘了删除它。感谢您的更正,我在阅读您的答案后发现: