如何在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,这很公平。