如何在Python中构造对称矩阵

时间:2018-04-08 12:50:14

标签: 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)

但我的回答给了我

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

我应该在对角线上1, 4, 6。谁能明白为什么?

2 个答案:

答案 0 :(得分:1)

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

正如@NicoSchertler所指出的,原始方法的问题在于转置和原始矩阵共享其数据,这意味着无论何时修改其中一个元素,相应的元素另一个也发生了变化。

因此,在您的原始和第二种方法中,您可能不想写入转置。你的第二种方法是好的:添加矩阵和转置并稍后处理对角线。但是你的第一个嵌套循环实际上没有效果,所以最好不要这样做。

此外,嵌套循环完全没有必要,浪费于设置对角线。

可以产生同样的效果
for i in range(3):
    Mat[i, i] = a[i]

但是你可以使用numpy的高级索引做得更好,无论如何你迟早要熟悉它:

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

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

答案 1 :(得分:0)

我找到了以下解决方案:

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个暗淡矩阵。