我正在尝试将矩阵逆时针旋转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度的简单方法?
答案 0 :(得分:2)
您可以执行以下操作:
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]
将其迭代成一个列表并反转它。
答案 1 :(得分:0)
您在这里所做的基本上是将矩阵 A 映射到矩阵 B ,这样:
B i j = A j i
如果您旋转元素 ,这意味着如果旋转 n×m -matrix,则意味着:
B i j = A j n-i
因此我们可以将其计算为:
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]])
答案 2 :(得分:0)
其他选择是使用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. Nested List的行和列进行转置,然后使用[::-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]])