Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy:创建对称矩阵类_Python_Arrays_Numpy - Fatal编程技术网

Python Numpy:创建对称矩阵类

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

基于,我用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.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)点是有意的,我需要矩阵有一个零对角线-我只是复制了代码,忘了删除它。感谢您的更正,我在阅读您的答案后发现: