2017-08-28 25 views
1

我有這樣旋轉由n個步驟外基質

matrix1 = [1,2 
      3,4] 

matrix2 =[1,2,3 
     4,5,6 
     7,8,9] 

我想旋轉通過如R某些步驟中,該矩陣的矩陣= 1,則輸出將像

output_matrix = [3,1 
       4,2] 

output_matrix = [4,1,2 
       7,5,3 
       8,9,6] 

我怎樣才能實現這一步的旋轉是動態的。

我發現這個解決方案,但這是固定的旋轉即ie。步= 1

def rotateMatrix(mat): 

    if not len(mat): 
     return 

    top = 0 
    bottom = len(mat)-1 

    left = 0 
    right = len(mat[0])-1 

    while left < right and top < bottom: 

     # Store the first element of next row, 
     # this element will replace first element of 
     # current row 
     prev = mat[top+1][left] 

     # Move elements of top row one step right 
     for i in range(left, right+1): 
      curr = mat[top][i] 
      mat[top][i] = prev 
      prev = curr 

     top += 1 

     # Move elements of rightmost column one step downwards 
     for i in range(top, bottom+1): 
      curr = mat[i][right] 
      mat[i][right] = prev 
      prev = curr 

     right -= 1 

     # Move elements of bottom row one step left 
     for i in range(right, left-1, -1): 
      curr = mat[bottom][i] 
      mat[bottom][i] = prev 
      prev = curr 

     bottom -= 1 

     # Move elements of leftmost column one step upwards 
     for i in range(bottom, top-1, -1): 
      curr = mat[i][left] 
      mat[i][left] = prev 
      prev = curr 

     left += 1 

    return mat 


matrix =[[1,2,3],[4,5,6], [7,8,9]] 

matrix = rotateMatrix(matrix) 
# # Print modified matrix 
print(matrix) 
+0

爲什麼不把你的旋轉矩陣多次調用來達到你想要的? –

+0

我可以,但這不是一個通用的解決方案。 – unknown

回答

0

您可以結合旋轉和轉置得到你想要的東西

import numpy as np 

m = np.array([[1,2],[3,4]], int) 
m1 = np.rot90(m) 
m2 = m1.transpose() 
print (m2) 

這會給你

[[2 1] 
[4 3]] 

更改自己的喜好。

其實你可以選擇這樣的

import numpy as np 
m = np.array([[1,2],[3,4]], int) 
# create tuple 
new = (m[0][1],m[1][0]) 
# print list 
print (list(new)) 

[2, 3] 
+0

如果不使用任何軟件包,我們不能做到這一點,我正在尋找解決方案,而不使用任何lib。 – unknown

+0

你真的得到他們的矩陣2例子正確嗎?我對此表示懷疑。 –

+0

Stefan Pochmann是正確的這個解決方案不適用於3 * 3矩陣。 –

0
def rotate(r,matrix): 
     '''for rotating the values on the outer ring of a matrix of size HxW''' 
     height = len(matrix) 
     width = len(matrix[0]) 
     matrixMap = mapMatrix(height,width) 
     r %= len(matrixMap) 
     rotatedMap = matrixMap[-r:]+matrixMap[:-r] 
     newMatrix = {el:matrix[el[0]][el[1]] for el in matrixMap} 
     for i,el in enumerate(rotatedMap): 
      matrix[matrixMap[i][0]][matrixMap[i][1]] = newMatrix[el] 
     return matrix 

def mapMatrix(h,w): 
     matrix = [] 
     for i in range(w): 
      matrix.append((0,i)) 
     for i in range(1,h): 
      matrix.append((i,w-1)) 
     for i in range(w-2,-1,-1): 
      matrix.append((h-1,i)) 
     for i in range(h-2,0,-1): 
      matrix.append((i,0)) 
     return matrix 

這是我將如何實現它的元素,但我覺得還是有一定的提升空間。支持負面的r。希望這可以幫助。