scipy.spatial.transform.Rotation.

apply#

Rotation.apply(self, vectors, inverse=False)#

將此旋轉應用於一組向量。

如果原始框架通過此旋轉旋轉到最終框架,那麼它可以通過兩種方式看待其在向量上的應用

  • 作為向量分量從最終框架到原始框架的投影。

  • 作為向量的物理旋轉,當其旋轉時被黏附到原始框架。在這種情況下,向量分量在旋轉之前和之後都在原始框架中表示。

就旋轉矩陣而言,此應用與 self.as_matrix() @ vectors 相同。

參數:
vectorsarray_like,形狀 (3,) 或 (N, 3)

每個 vectors[i] 代表 3D 空間中的一個向量。單個向量可以使用形狀 (3, )(1, 3) 來指定。給定的旋轉次數和向量數量必須遵循標準 numpy 廣播規則:要麼其中一個等於單位值,要麼它們彼此相等。

inverseboolean,可選

如果為 True,則將旋轉的反向應用於輸入向量。預設值為 False。

返回:
rotated_vectorsndarray,形狀 (3,) 或 (N, 3)

在輸入向量上應用旋轉的結果。形狀取決於以下情況

  • 如果物件包含單一旋轉(相對於包含單一旋轉的堆疊),並且使用形狀 (3,) 指定了單個向量,則 rotated_vectors 的形狀為 (3,)

  • 在所有其他情況下,rotated_vectors 的形狀為 (N, 3),其中 N 是旋轉次數或向量數量。

範例

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