Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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中构造对称矩阵_Python_Arrays_Python 3.x_Numpy_Matrix - Fatal编程技术网

如何在Python中构造对称矩阵

如何在Python中构造对称矩阵,python,arrays,python-3.x,numpy,matrix,Python,Arrays,Python 3.x,Numpy,Matrix,我有以下几点 Import numpy as np Mat1 = np.array([[1, 2, 3], [0, 4, 5], [0, 0, 6]]) Mat2 = np.transpose(Mat1) for i in range(3): for k in range(3): if i == k: Mat2[i,k] = 0 Mat = Mat2 + Mat1 print(Mat) 但我的回答

我有以下几点

Import numpy as np

Mat1 = np.array([[1, 2, 3],
            [0, 4, 5],
            [0, 0, 6]])
Mat2 = np.transpose(Mat1)
for i in range(3):
    for k in range(3):
        if i == k:
            Mat2[i,k] = 0
Mat = Mat2 + Mat1
print(Mat)
但我的回答告诉我

[[0 2 3]
 [2 0 5]
 [3 5 0]]

当我应该在对角线中有
1,4,6
时。有人知道为什么吗?

我找到了以下解决方案:

Mat1 = np.array([[0, 2, 3],
            [0, 0, 5],
            [0, 0, 0]])
a = np.array([1, 4, 6])
Mat2 = np.transpose(Mat1)
for i in range(3):
    for k in range(3):
        if i == k:
            Mat2[i,k] = 0
Mat = Mat2 + Mat1
for i in range(3):
    for k in range(3):
        if i == k:
            Mat[i,k] = a[i]
print(Mat)
答案是:

[[1 2 3]
 [2 4 5]
 [3 5 6]]

适用于任何尺寸,如我的其他31维矩阵。

您可能需要考虑的一些建议:

正如@NicoSchertler所指出的,原始方法的问题在于转置和原始矩阵共享它们的数据,这意味着每当修改其中一个元素时,另一个元素的对应元素也会发生变化

因此,在最初的方法和第二种方法中,您可能不想写入转置。第二种方法很好:添加矩阵和转置,然后处理对角线。但您的第一个嵌套循环实际上没有效果,所以最好不要使用它

此外,嵌套循环对于设置对角线是完全不必要和浪费的。您可以通过以下方式获得相同的效果:

for i in range(3):
    Mat[i, i] = a[i]
但使用numpy的高级索引,您可以做得更好,您迟早都会想熟悉它:

idx = np.arange(3)
Mat[idx, idx] = a

这是循环的矢量化形式,您应该养成尽可能避免循环的习惯,并找到矢量化的解决方案。

从文档中可以看出:尽可能返回视图。。因此,通过将对角线设置为零,您可能同时修改了两个矩阵。使用
Mat2=np.transpose(Mat1.copy()
@WarrenWeckesser)创建
Mat2
,您不认为这有点浪费吗?在该代码中我会更改很多内容。我的评论是对眼前问题的一个快速修复。@WarrenWeckesser,这很公平。