Python:在次要对角线上移调

时间:2015-11-30 10:10:51

标签: python python-2.7 transpose

如果我有这个矩阵,例如:

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

3 个答案:

答案 0 :(得分:1)

您的代码不起作用,因为您将每对变量交换两次,再次构建相同的矩阵。

此外,您不需要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]

答案 1 :(得分:1)

您的代码无效,因为您将项目交换两次:matrix[i][j]matrix[4-i][4-j]交换i j[1, 2, 3]你交换了:

  • [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]

答案 2 :(得分:1)

考虑将list转换为类似数组的对象,例如np.matrix,以利用标准的2D操作。例如:

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]