scipy.spatial.transform.Rotation.

__mul__#

Rotation.__mul__(other)[source]#

与另一个旋转进行组合。

如果 pq 是两个旋转,那么 ‘q 接着 p’ 的组合等价于 p * q。就旋转矩阵而言,组合可以表示为 p.as_matrix() @ q.as_matrix()

参数:
otherRotation 实例

要与此旋转组合的旋转对象。请注意,旋转组合不具有交换律,因此 p * q 通常与 q * p 不同。

返回:
compositionRotation 实例

此函数支持一次组合多个旋转。组合遵循标准的 numpy 广播规则。生成的 Rotation 对象将具有形状 np.broadcast_shapes(p.shape, q.shape)。在大小大于 1 的维度中,旋转与匹配的索引进行组合。在只有一个旋转的维度中,单个旋转与另一个对象中的每个旋转进行组合。

附注

数组 API 标准支持

__mul__ 对 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

组合两个单个旋转

>>> p = R.from_quat([0, 0, 1, 1])
>>> q = R.from_quat([1, 0, 0, 1])
>>> p.as_matrix()
array([[ 0., -1.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.]])
>>> q.as_matrix()
array([[ 1.,  0.,  0.],
       [ 0.,  0., -1.],
       [ 0.,  1.,  0.]])
>>> r = p * q
>>> r.as_matrix()
array([[0., 0., 1.],
       [1., 0., 0.],
       [0., 1., 0.]])

组合包含相同数量旋转的两个对象

>>> p = R.from_quat([[0, 0, 1, 1], [1, 0, 0, 1]])
>>> q = R.from_rotvec([[np.pi/4, 0, 0], [-np.pi/4, 0, np.pi/4]])
>>> p.as_quat()
array([[0.        , 0.        , 0.70710678, 0.70710678],
       [0.70710678, 0.        , 0.        , 0.70710678]])
>>> q.as_quat()
array([[ 0.38268343,  0.        ,  0.        ,  0.92387953],
       [-0.37282173,  0.        ,  0.37282173,  0.84971049]])
>>> r = p * q
>>> r.as_quat()
array([[ 0.27059805,  0.27059805,  0.65328148,  0.65328148],
       [ 0.33721128, -0.26362477,  0.26362477,  0.86446082]])

适用广播规则: >>> p = R.from_quat(np.tile(np.array([0, 0, 1, 1]), (5, 1, 1))) >>> q = R.from_quat(np.tile(np.array([1, 0, 0, 1]), (1, 6, 1))) >>> p.shape, q.shape ((5, 1), (1, 6)) >>> r = p * q >>> r.shape (5, 6)