簡體   English   中英

如何將矩陣(嵌套列表)逆時針旋轉90度

[英]How to rotate a matrix (nested list) counter clockwise by 90 degrees

我試圖將矩陣逆時針旋轉90度。 例如,如果:

m = [[1,2,3],
     [2,3,3],
     [5,4,3]]

那么結果應該是

m = [[3,3,3],
     [2,3,4],
     [1,2,5]]

到目前為止,我發現:

rez = [[m[j][i] for j in range(len(m))] for i in range(len(m[0]))]
    for row in rez:
        print(row)

這給了我

[1, 2, 5]
[2, 3, 4]
[3, 3, 3]

這很接近,但行需要反轉。 有沒有人知道一種簡單的方法將這個矩陣逆時針旋轉90度?

您可以執行以下操作:

m = [[1, 2, 3],
     [2, 3, 3],
     [5, 4, 3]]

result = list(map(list, zip(*m)))[::-1]

print(result)

產量

[[3, 3, 3],
 [2, 3, 4],
 [1, 2, 5]]

使用map(list, zip(*m))您可以創建列的可迭代,並使用表達式list(...)[::-1]將該iterable轉換為列表並將其反轉。

你在這里基本上做的是將矩陣A映射到矩陣B,這樣:

B ij = A ji

如果你旋轉元素,這意味着如果你旋轉一個n×m矩陣,那意味着:

B ij = A j ni

所以我們可以將其計算為:

rez = [[m[j][ni] for j in range(len(m))] for ni in range(len(m[0])-1, -1, -1)]

這是轉置,但比“逆轉”。 然而,使用索引通常不是如何在Python中進行此類處理,因為現在它僅適用於可訂閱的項目,因此我建議您尋找更優雅的解決方案。

但話雖如此,numpy提供了一個numpy.rot90函數來旋轉矩陣:

>>> np.rot90(m)
array([[3, 3, 3],
       [2, 3, 4],
       [1, 2, 5]])

其他選項是使用scipy.ndimage.rotate

旋轉一個數組。

使用所請求順序的樣條插值,在由軸參數給出的兩個軸定義的平面中旋轉陣列。

import numpy as np
from  scipy import ndimage

m = np.matrix([[1,2,3],
               [2,3,3],
               [5,4,3]])

ndimage.rotate(m, 90.0) #angle as float.
 Out: array([[3, 3, 3], [2, 3, 4], [1, 2, 5]]) 

通過使用zip()函數轉置5.1.4的行和列,可以獲得相同的結果 嵌套列表然后使用[::-1] +放入np.matrix中反轉嵌套列表:

matrix = [[1, 2, 3],
          [2, 3, 3],
          [5, 4, 3]]

np.matrix(list(zip(*matrix)))[::-1]
 Out: matrix([[3, 3, 3], [2, 3, 4], [1, 2, 5]]) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM