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