scipy.spatial.transform.Rotation.

apply#

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

Diese Rotation auf eine Menge von Vektoren anwenden.

Wenn der ursprüngliche Bezugsrahmen durch diese Rotation in den Endbezugsrahmen übergeht, dann kann seine Anwendung auf einen Vektor auf zwei Arten betrachtet werden:

  • Als Projektion von Vektorkomponenten, die im Endbezugsrahmen ausgedrückt sind, in den Ursprungsbezugsrahmen.

  • Als physikalische Drehung eines Vektors, der am Ursprungsbezugsrahmen befestigt ist, während dieser sich dreht. In diesem Fall werden die Vektorkomponenten vor und nach der Drehung im Ursprungsbezugsrahmen ausgedrückt.

In Bezug auf Rotationsmatrizen ist diese Anwendung dieselbe wie self.as_matrix() @ vectors.

Parameter:
vectorsarray_like, Form (3,) oder (N, 3)

Jeder vectors[i] repräsentiert einen Vektor im 3D-Raum. Ein einzelner Vektor kann entweder mit der Form (3, ) oder (1, 3) angegeben werden. Die Anzahl der Rotationen und die Anzahl der angegebenen Vektoren müssen den üblichen NumPy-Broadcasting-Regeln folgen: Entweder ist eine davon Eins oder beide sind gleich.

inverseboolean, optional

Wenn True, wird die Inverse der Rotation(en) auf die Eingabevektoren angewendet. Standard ist False.

Rückgabe:
rotated_vectorsndarray, Form (3,) oder (N, 3)

Ergebnis der Anwendung der Rotation auf die Eingabevektoren. Die Form hängt von den folgenden Fällen ab:

  • Wenn das Objekt eine einzelne Rotation (im Gegensatz zu einem Stapel mit einer einzelnen Rotation) enthält und ein einzelner Vektor mit der Form (3,) angegeben wird, dann hat rotated_vectors die Form (3,).

  • In allen anderen Fällen hat rotated_vectors die Form (N, 3), wobei N entweder die Anzahl der Rotationen oder der Vektoren ist.

Beispiele

>>> from scipy.spatial.transform import Rotation as R
>>> import numpy as np

Einzelne Rotation angewendet auf einen einzelnen Vektor

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

Einzelne Rotation angewendet auf mehrere Vektoren

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

Mehrere Rotationen auf einen einzelnen Vektor

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

Mehrere Rotationen auf mehrere Vektoren. Jede Rotation wird auf den entsprechenden Vektor angewendet

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

Es ist auch möglich, die inverse Rotation anzuwenden

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