scipy.spatial.transform.Rotation.
apply#
- Rotation.apply(vectors, inverse=False)[source]#
将此旋转应用于一组向量。
如果原始坐标系通过此旋转旋转到最终坐标系,则其对向量的应用可以从两种方式来看待
作为将向量分量从最终坐标系投影到原始坐标系。
作为将向量(粘附在原始坐标系上)在旋转时进行物理旋转。在这种情况下,向量分量在旋转之前和之后都表示在原始坐标系中。
就旋转矩阵而言,此应用与
self.as_matrix() @ vectors相同。- 参数:
- vectorsarray_like, shape (…, 3)
每个 vectors[…, :] 代表 3D 空间中的一个向量。旋转的形状和给定的向量形状必须遵循标准的 numpy 广播规则:要么其中之一等于单位,要么它们都相等。
- inverseboolean, optional
如果为 True,则将旋转的逆应用于输入向量。默认值为 False。
- 返回:
- rotated_vectorsndarray, shape (…, 3)
将旋转应用于输入向量的结果。形状根据 numpy 广播规则确定。例如,结果的形状将为 np.broadcast_shapes(r.shape, v.shape[:-1]) + (3,)
附注
数组 API 标准支持
apply对 Python Array API Standard 兼容的后端具有实验性支持,除了 NumPy 之外。请考虑通过设置环境变量SCIPY_ARRAY_API=1并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。库
CPU
GPU
NumPy
✅
不适用
CuPy
不适用
⛔
PyTorch
✅
✅
JAX
✅
✅
Dask
⛔
不适用
有关更多信息,请参阅 对数组 API 标准的支持。
示例
>>> from scipy.spatial.transform import Rotation as R >>> import numpy as np
将单个旋转应用于单个向量
>>> vector = np.array([1, 0, 0]) >>> r = R.from_rotvec([0, 0, np.pi/2]) >>> r.as_matrix() array([[ 2.22044605e-16, -1.00000000e+00, 0.00000000e+00], [ 1.00000000e+00, 2.22044605e-16, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]) >>> r.apply(vector) array([2.22044605e-16, 1.00000000e+00, 0.00000000e+00]) >>> r.apply(vector).shape (3,)
将单个旋转应用于多个向量
>>> vectors = np.array([ ... [1, 0, 0], ... [1, 2, 3]]) >>> r = R.from_rotvec([0, 0, np.pi/4]) >>> r.as_matrix() array([[ 0.70710678, -0.70710678, 0. ], [ 0.70710678, 0.70710678, 0. ], [ 0. , 0. , 1. ]]) >>> r.apply(vectors) array([[ 0.70710678, 0.70710678, 0. ], [-0.70710678, 2.12132034, 3. ]]) >>> r.apply(vectors).shape (2, 3)
将多个旋转应用于单个向量
>>> r = R.from_rotvec([[0, 0, np.pi/4], [np.pi/2, 0, 0]]) >>> vector = np.array([1,2,3]) >>> r.as_matrix() array([[[ 7.07106781e-01, -7.07106781e-01, 0.00000000e+00], [ 7.07106781e-01, 7.07106781e-01, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]], [[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 2.22044605e-16, -1.00000000e+00], [ 0.00000000e+00, 1.00000000e+00, 2.22044605e-16]]]) >>> r.apply(vector) array([[-0.70710678, 2.12132034, 3. ], [ 1. , -3. , 2. ]]) >>> r.apply(vector).shape (2, 3)
将多个旋转应用于多个向量。每个旋转应用于相应的向量
>>> r = R.from_euler('zxy', [ ... [0, 0, 90], ... [45, 30, 60]], degrees=True) >>> vectors = [ ... [1, 2, 3], ... [1, 0, -1]] >>> r.apply(vectors) array([[ 3. , 2. , -1. ], [-0.09026039, 1.11237244, -0.86860844]]) >>> r.apply(vectors).shape (2, 3)
适用广播规则
>>> r = R.from_rotvec(np.tile([0, 0, np.pi/4], (5, 1, 4, 1))) >>> vectors = np.ones((3, 4, 3)) >>> r.shape, vectors.shape ((5, 1, 4), (3, 4, 3)) >>> r.apply(vectors).shape (5, 3, 4, 3)
也可以应用逆旋转
>>> r = R.from_euler('zxy', [ ... [0, 0, 90], ... [45, 30, 60]], degrees=True) >>> vectors = [ ... [1, 2, 3], ... [1, 0, -1]] >>> r.apply(vectors, inverse=True) array([[-3. , 2. , 1. ], [ 1.09533535, -0.8365163 , 0.3169873 ]])