Python:numpy.rot90() 三维矩阵绕着某一轴旋转


  在NumPy中,可以使用 numpy.rot90() 函数对三维矩阵绕着某个轴旋转。

1. numpy.rot90() 语法

numpy.rot90(m, k=1, axes=(0, 1)).

  • m: 输入的数组。
  • k: 旋转的次数,默认为1。
  • axes: 旋转的轴,默认为(0, 1)。旋转方向:是从第一轴到第二轴

2. numpy.rot90() 举例说明

下面是一个具体的例子,演示如何在三维矩阵上绕着某个轴旋转:

import numpy as np

# 创建一个三维数组
matrix_3d = np.array([[[1, 2, 3], [4, 5, 6]],
                      [[7, 8, 9], [10, 11, 12]],
                      [[13, 14, 15], [16, 17, 18]]])

# 使用 rot90 函数绕着第三个轴逆时针旋转90度
result_3d = np.rot90(matrix_3d, k=1, axes=(2, 0))

# 输出原始三维数组和旋转后的数组
print("原始三维数组:")
print(matrix_3d)

print("\n绕着第三个轴逆时针旋转90度后的数组:")
print(result_3d)

这里的 axes=(2, 0) 表示绕着第三个轴逆时针旋转(z轴到x轴:)90度。

输出结果如下:

原始三维数组:
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]

 [[13 14 15]
  [16 17 18]]]

绕着第三个轴逆时针旋转90度后的数组:
[[[ 1  7 13]
  [ 4 10 16]]

 [[ 2  8 14]
  [ 5 11 17]]

 [[ 3  9 15]
  [ 6 12 18]]]

通过指定 k 参数,还可以实现不同次数的旋转。

3.axes说明

  axes 参数用于指定绕着哪两个轴进行旋转。在三维矩阵中,通常有三个轴:0、1、2。这些轴分别对应数组的三个维度x,y,z。

  考虑一个三维矩阵 arr,其形状为 (n, m, p),其中 n、m、p 分别是矩阵在三个维度上的大小。axes 参数是一个包含两个元素的元组,用于指定旋转操作涉及的两个轴。

  例如,axes=(1, 2) 表示绕着第一个轴旋转,方向为第二个轴到第三个轴

下面是一个例子,演示了不同 axes 参数值对旋转结果的影响:

import numpy as np

arr = np.array([[[1, 2], [3, 4]],
                [[5, 6], [7, 8]]])

# 默认情况下,绕着前两个轴 (0, 1) 逆时针旋转90度
result_default = np.rot90(arr)
print("默认情况下绕着前两个轴逆时针旋转90度:")
print(result_default)

# 指定 axes=(0, 2),绕着第一个轴和第三个轴逆时针旋转90度
result_axes_0_2 = np.rot90(arr, axes=(0, 2))
print("\n指定 axes=(0, 2),绕着第一个轴和第三个轴逆时针旋转90度:")
print(result_axes_0_2)

输出结果:

默认情况下绕着前两个轴逆时针旋转90度:
[[[2 4]
  [1 3]]

 [[6 8]
  [5 7]]]

指定 axes=(0, 2),绕着第一个轴和第三个轴逆时针旋转90度:
[[[3 1]
  [4 2]]

 [[7 5]
  [8 6]]]

通过调整 axes 参数,你可以控制旋转的轴,从而影响旋转结果。

### 绕旋转三维旋转矩阵 对于三维空间中的物体,可以围绕不同的坐标进行旋转。绕特定旋转的角度可以通过旋转矩阵来表示。 #### 绕 Z 旋转 当对象绕 Z 逆时针方向旋转角度 θ 时,对应的旋转矩阵如下: \[ R_z(\theta)= \begin{bmatrix} \cos{\theta} & -\sin{\theta} & 0 \\ \sin{\theta} & \cos{\theta} & 0 \\ 0 & 0 & 1 \end{bmatrix} \] 这个公式与二维平面上的旋转矩阵非常相似[^1]。 #### 绕 X 旋转 如果要让对象沿正向绕 X 转过一定角度 φ,则其变换可以用下面的矩阵描述: \[ R_x(\phi)= \begin{bmatrix} 1 & 0 & 0\\ 0& \cos{\phi}&-\sin{\phi}\\ 0& \sin{\phi}& \cos{\phi} \end{bmatrix} \] 同样地,这里也体现了与二维情况下的类比关系。 #### 绕 Y 旋转 同样的道理适用于绕Y的情况,此时有: \[ R_y(\psi)= \begin{bmatrix} \cos{\psi} & 0 & \sin{\psi}\\ 0 & 1 & 0\\ -\sin{\psi} & 0 & \cos{\psi} \end{bmatrix} \] 以上三种基本形式构成了基础构建模块,在实际应用中往往需要组合这些操作完成更复杂的姿态调整任务。 #### 绕任意单位矢量 n 的旋转 (罗德里格斯公式) 为了实现更加灵活的变化效果——即允许指定一条直线作为新的旋转中心线并沿着这条线上下移动——需要用到所谓的“罗德里格斯(Rodrigues)”公式。该方法首先通过一系列标准基底之间的转换使给定的方向向量n对齐至z位置;接着执行常规意义上的z转动;最后再反向映射回原始参照系内。具体表达式为: \[ R(n,\alpha) = I + (\sin\alpha)[n]_{×}+(1-\cos\alpha)[n]_{×}[n]_{×}\] 其中 \(I\) 是恒等阵, \([n]_×\) 表示由向量\(n=(nx,ny,nz)\)定义的一个反对称交叉乘积矩阵: \[[n]_\times=\left[\begin{array}{ccc} 0 & -nz & ny \\ nz & 0 & -nx \\ -ny & nx & 0 \end{array}\right]\][^2]. ```python import numpy as np def rodrigues_rotation_matrix(axis, theta): """ 计算基于Rodriguez公式的旋转矩阵 参数: axis -- 单位长度的旋转向量(numpy array) theta -- 旋转角度(float),弧度制 返回值: rot_mat -- 3x3大小的numpy数组代表旋转后的矩阵 """ kx, ky, kz = axis / np.linalg.norm(axis) # 归一化输入向量 cth = np.cos(theta); sth = np.sin(theta); cross_prod_mtx = np.array([[0,-kz,ky], [kz,0,-kx], [-ky,kx,0]]) outer_product = np.outer(axis,axis) identity = np.eye(3,dtype=float) rot_mat = ( identity * cth + cross_prod_mtx * sth + outer_product*(1-cth)) return rot_mat ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值