Python:转置次对角线
Python: Transpose over the secondary diagonal
如果我有这个矩阵,例如:
matrix = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]]
我想将它转置到次对角线上,而不触及第一行和第一列。它看起来像这样:
matrix = [[1, 2, 3, 4],
[5, 16, 12, 8],
[9, 15, 11, 7],
[13, 14, 10, 6]]
这是我试过的方法,但它不会改变矩阵:
for i in range(1, 4):
for j in range(1, 4):
temp = copy.deepcopy(matrix[i][j])
matrix[i][j] = matrix[4-j][4-i]
matrix[4-j][4-i] = temp
您的代码不起作用,因为您将每对变量交换两次,再次构建相同的矩阵。
此外,您不需要 copy.deepcopy
调用整数矩阵,并且您引用了一个未定义的 table
变量
# Working code
for i in range(1, 4):
for j in range(1, 4 - i):
matrix[i][j], matrix[4 - j][4 - i] = matrix[4 - j][4 - i], matrix[i][j]
您的代码不起作用,因为您交换了两次项目:将 matrix[i][j]
与 matrix[4-i][4-j]
与 [=15= 中的 i
和 j
交换] 表示你交换:
[1][1]
与 [3][3]
[1][2]
与 [3][2]
- ...
- 再次
[3][2]
与 [1][2]
- 再次
[3][3]
和 [1][1]
你可以清楚地看到你将每个项目交换了两次,这让你回到了原来的矩阵。要解决此问题,您只需使用 range(1, 3)
即可。
此外,您可以内联交换值,不需要使用 copy
和临时变量。这是一个工作示例:
for i in range(1, 3):
for j in range(1, 3):
matrix[i][j], matrix[4-j][4-i] = matrix[4-j][4-i], matrix[i][j]
考虑将您的 list
转换为类似数组的对象,例如 np.matrix
以利用标准的二维操作。例如:
import numpy as np
matrix = np.matrix([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
matrix[1:,1:]=matrix[1:,1:][::-1].transpose()[::-1]
如果我有这个矩阵,例如:
matrix = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]]
我想将它转置到次对角线上,而不触及第一行和第一列。它看起来像这样:
matrix = [[1, 2, 3, 4],
[5, 16, 12, 8],
[9, 15, 11, 7],
[13, 14, 10, 6]]
这是我试过的方法,但它不会改变矩阵:
for i in range(1, 4):
for j in range(1, 4):
temp = copy.deepcopy(matrix[i][j])
matrix[i][j] = matrix[4-j][4-i]
matrix[4-j][4-i] = temp
您的代码不起作用,因为您将每对变量交换两次,再次构建相同的矩阵。
此外,您不需要 copy.deepcopy
调用整数矩阵,并且您引用了一个未定义的 table
变量
# Working code
for i in range(1, 4):
for j in range(1, 4 - i):
matrix[i][j], matrix[4 - j][4 - i] = matrix[4 - j][4 - i], matrix[i][j]
您的代码不起作用,因为您交换了两次项目:将 matrix[i][j]
与 matrix[4-i][4-j]
与 [=15= 中的 i
和 j
交换] 表示你交换:
[1][1]
与[3][3]
[1][2]
与[3][2]
- ...
- 再次
[3][2]
与[1][2]
- 再次
[3][3]
和[1][1]
你可以清楚地看到你将每个项目交换了两次,这让你回到了原来的矩阵。要解决此问题,您只需使用 range(1, 3)
即可。
此外,您可以内联交换值,不需要使用 copy
和临时变量。这是一个工作示例:
for i in range(1, 3):
for j in range(1, 3):
matrix[i][j], matrix[4-j][4-i] = matrix[4-j][4-i], matrix[i][j]
考虑将您的 list
转换为类似数组的对象,例如 np.matrix
以利用标准的二维操作。例如:
import numpy as np
matrix = np.matrix([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
matrix[1:,1:]=matrix[1:,1:][::-1].transpose()[::-1]