[英]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.