我有以下
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
。谁能明白为什么?
答案 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个暗淡矩阵。