【问题标题】:How to construct a symmetric matrix in Python如何在 Python 中构造对称矩阵
【发布时间】:2018-04-08 12:50:14
【问题描述】:

我有以下

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。有谁知道为什么?

【问题讨论】:

  • 来自文档:尽可能返回视图。。因此,通过将对角线设置为零,您可能会同时修改两个矩阵。
  • Mat2 = np.transpose(Mat1).copy()创建Mat2
  • @WarrenWeckesser 有点浪费,你不觉得吗?
  • 该代码中有一个 lot 我会更改。我的评论是解决眼前问题的快速方法。
  • @WarrenWeckesser 够公平的。

标签: python arrays python-3.x numpy matrix


【解决方案1】:

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

正如@NicoSchertler 所指出的,您原来方法的问题在于转置和原始矩阵共享它们的数据,这意味着每当您修改两者之一的元素时,相应的元素其他的也发生变化。

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

进一步的嵌套循环对于设置对角线是完全没有必要和浪费的。您可以通过

获得相同的效果
for i in range(3):
    Mat[i, i] = a[i]

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

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

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

【讨论】:

    【解决方案2】:

    我找到了以下解决方案:

    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 暗矩阵一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多