13. NumPy矩阵的旋转
在用Python的数字图像处理、CNN或者深度学习里,对图像的处理:形变(缩放)处理常将图像数据读取到NumPy的array数据里,然后对图像数据进行形变处理。NumPy提供了很多的对array数组的操作:tile、rot90等。本章除了了解rot90的基本使用外,自己也想写点程序实现旋转的功能。
13.1 rot90函数实现矩阵旋转
从NumPy的官方完整查到rot90函数语法格式如下:
rot90(m, k=1, axes=(0, 1)
m是要旋转的数组(矩阵),k是旋转的次数,默认旋转1次,那是顺时针还是逆时针呢?正数表示逆时针,而k为负数时则是对数组进行顺时针方向的旋转。
import numpy as np
mat = np.array([[1,3,5],
[2,4,6],
[7,8,9]
])
print mat, "# orignal"
mat90 = np.rot90(mat, 1)
print mat90, "# rorate 90 anti-clockwise"
mat90 = np.rot90(mat, -1)
print mat90, "# rorate 90 clockwise"
mat180 = np.rot90(mat, 2)
print mat180, "# rorate 180 anti-clockwise"
mat270 = np.rot90(mat, 3)
print mat270, "# rorate 270 anti-clockwise"
执行结果:
[[1 3 5]
[2 4 6]
[7 8 9]] # orignal
[[5 6 9]
[3 4 8]
[1 2 7]] # rorate 90 anti-clockwise
[[7 2 1]
[8 4 3]
[9 6 5]] # rorate 90 clockwise
[[9 8 7]
[6 4 2]
[5 3 1]] # rorate 180 anti-clockwise
[[7 2 1]
[8 4 3]
[9 6 5]] # rorate 270 anti-clockwise
可见逆时针旋转$270^{\ \circ}$等价于顺时针旋转$90^{\ \circ}$。
13.2 Python实现方阵的旋转
下面自己编写旋转功能。根据矩阵理论,
$\bigotimes\ $对方阵$A_{n \times n}$左乘一个负对角线上均是1、其余都是0的方阵(记作:$E^{-1}$)实现方阵$A_{n \times n}$的行的互换。
$\bigotimes\ $对方阵$A_{n \times n}$右乘一个负对角线上均是1、其余都是0的方阵而实现对方阵$A_{n \times n}$的列的互换。
$\bigotimes\ $对方阵$A_{n \times n}$的转置$A_{n\times n}^{T}$左乘一个负对角线上均是1、其余都是0的方阵$A_{n \times n}$实现向左(逆时针)90$^{\ \circ}$旋转。
$\bigotimes\ $对方阵$A_{n \times n}$的转置$A_{n\times n}^{T}$右乘一个负对角线上均是1、其余都是0的方阵$A_{n \times n}$实现向右(顺时针)90$^{\ \circ}$旋转。
$\bigotimes\ $对方阵$A_{n \times n}$左右各乘一个负对角线上均是1、其余都是0的方阵而实现对方阵$A_{n \times n}$的180$^{\ \circ}$旋转。
显然要想自己实现对方阵的旋转&