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 ]])