Python矩阵转置问题

将一个5*5的矩阵的最外圈数字逆时针移动一个单位。
原矩阵
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
转置后
2 3 4 5 10
1 7 8 9 15
6 12 13 14 20
11 17 18 19 25
16 21 22 23 24
进一步问个问题,如何将内圈的数字也如最外圈一样转置

先给个外层旋转可适配n*n的,刚才弄成顺时针的了:

import numpy as np
def printLst(lst):
    for row in lst:
        for i in row:
            print(str(i).rjust(3),end=' ')
        print()
    print('='*100)

def turn0(lst,n):
    arr = np.array(lst)
    turnindex = np.array([list(arr[0,:-1]),list(arr[:-1,n-1]),list(arr[n-1,1:][::-1]),list(arr[1:,0][::-1])])
    turnindex = list(np.reshape(turnindex,(1,(n-1)*4))[0])
    newindex = turnindex.copy()
    newindex[-1] = turnindex[0]
    newindex[0:-1] = turnindex[1:]
    lst = list(arr.reshape((1,n**2))[0])
    for i in range(len(lst)):
        t = lst[i]
        if t in turnindex:
            lst[i] = newindex[turnindex.index(t)]
    lst = list(np.array(lst).reshape((n,n)))
    return lst

n = int(input('请输入n:'))
lst = []
for i in range(n):
    row = []
    for j in range(n):
        row.append(n*i+j+1)
    lst.append(row)
printLst(lst)
printLst(turn0(lst,n))

img

img

img


你题目的解答代码如下:

li = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25]
]
w = 5
h = 5
sp = [(0,x) for x in range(0,w-1)]
sp += [(y,w-1) for y in range(0,h-1)]
sp += [(h-1,x) for x in range(w-1,0,-1)]
sp += [(y,0) for y in range(h-1,0,-1)]
tmp = li[sp[0][0]][sp[0][1]]
for i in range(len(sp)-1):
    li[sp[i][0]][sp[i][1]] = li[sp[i+1][0]][sp[i+1][1]]
li[sp[-1][0]][sp[-1][1]] = tmp

for r in li:
    for c in r:
        print(f'{c:3d}',end="")
    print()

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

我也来凑个热闹,来个8x8矩阵(可以自定义),任意逆时针转动某一圈(从外向内1~4)的效果:

请输入矩阵的边长:8
[1, 2, 3, 4, 5, 6, 7, 8]
[9, 10, 11, 12, 13, 14, 15, 16]
[17, 18, 19, 20, 21, 22, 23, 24]
[25, 26, 27, 28, 29, 30, 31, 32]
[33, 34, 35, 36, 37, 38, 39, 40]
[41, 42, 43, 44, 45, 46, 47, 48]
[49, 50, 51, 52, 53, 54, 55, 56]
[57, 58, 59, 60, 61, 62, 63, 64]
请输入要逆时针转动矩阵从外向内第几圈:1
[2, 3, 4, 5, 6, 7, 8, 16]
[1, 10, 11, 12, 13, 14, 15, 24]
[9, 18, 19, 20, 21, 22, 23, 32]
[17, 26, 27, 28, 29, 30, 31, 40]
[25, 34, 35, 36, 37, 38, 39, 48]
[33, 42, 43, 44, 45, 46, 47, 56]
[41, 50, 51, 52, 53, 54, 55, 64]
[49, 57, 58, 59, 60, 61, 62, 63]
请输入要逆时针转动矩阵从外向内第几圈:2
[2, 3, 4, 5, 6, 7, 8, 16]
[1, 11, 12, 13, 14, 15, 23, 24]
[9, 10, 19, 20, 21, 22, 31, 32]
[17, 18, 27, 28, 29, 30, 39, 40]
[25, 26, 35, 36, 37, 38, 47, 48]
[33, 34, 43, 44, 45, 46, 55, 56]
[41, 42, 50, 51, 52, 53, 54, 64]
[49, 57, 58, 59, 60, 61, 62, 63]
请输入要逆时针转动矩阵从外向内第几圈:3
[2, 3, 4, 5, 6, 7, 8, 16]
[1, 11, 12, 13, 14, 15, 23, 24]
[9, 10, 20, 21, 22, 30, 31, 32]
[17, 18, 19, 28, 29, 38, 39, 40]
[25, 26, 27, 36, 37, 46, 47, 48]
[33, 34, 35, 43, 44, 45, 55, 56]
[41, 42, 50, 51, 52, 53, 54, 64]
[49, 57, 58, 59, 60, 61, 62, 63]
请输入要逆时针转动矩阵从外向内第几圈:4
[2, 3, 4, 5, 6, 7, 8, 16]
[1, 11, 12, 13, 14, 15, 23, 24]
[9, 10, 20, 21, 22, 30, 31, 32]
[17, 18, 19, 29, 37, 38, 39, 40]
[25, 26, 27, 28, 36, 46, 47, 48]
[33, 34, 35, 43, 44, 45, 55, 56]
[41, 42, 50, 51, 52, 53, 54, 64]
[49, 57, 58, 59, 60, 61, 62, 63]

代码:

def genLink(matrix,n):
    link=[]
    for i in range(n//2):
        temp=[]
        temp+=matrix[i][i:-i] if i>0 else matrix[i][:]
        for j in range(i+1,n-i-1):
            temp.append(matrix[j][-i-1])
        temp+=matrix[n-i-1][-i-1:i-1:-1] if i>0 else matrix[n-i-1][::-1]
        for j in range(n-i-2,i,-1):
            temp.append(matrix[j][i])
        link.append(temp)
    if n%2:link.append([matrix[n//2][n//2]])
    return link

def newMatrix(link,n):
    matrix=[[0 for _ in range(n)] for _ in range(n)]
    for i in range(n//2):
        k=0
        for j in range(i,n-i):
            matrix[i][j]=link[i][k]
            k+=1
        for j in range(i+1,n-i-1):
            matrix[j][-i-1]=link[i][k]
            k+=1
        for j in range(n-i-1,i-1,-1):
            matrix[n-i-1][j]=link[i][k]
            k+=1
        for j in range(n-i-2,i,-1):
            matrix[j][i]=link[i][k]
            k+=1
    if n%2:matrix[n//2][n//2]=link[i+1][0]
    return matrix

n=int(input('请输入矩阵的边长:'))
matrix=[]
for i in range(n):
    matrix.append([j+i*n+1 for j in range(n)])
    print(matrix[i])
link=genLink(matrix,n)

while True:
    m=int(input('请输入要逆时针转动矩阵从外向内第几圈:'))-1
    link[m]=link[m][1:]+[link[m][0]]
    matrix=newMatrix(link,n)
    for i in matrix:
        print(i)