본문 바로가기
머신러닝을 위한 파이썬 기초/넘파이

[파이썬 numpy] 여러 점들에 변환행렬 한번에 적용하기

by bigpicture 2024. 10. 13.
반응형

아래와 같이 여러개의 점이 하나의 배열에 들어 있습니다.

 

import numpy as np

points = np.array([[4, 5, 6],
                   [7, 8, 9],
                   [10, 11, 12],
                   [10, 11, 12],
                   [10, 11, 12]])

 

아래와 같은 변환행렬을 각각의 점에 적용하고 싶은 상황입니다. x축 대칭이동을 해주는 변환행렬입니다.

 

T=np.array([[1,0,0],[0,-1,0],[0,0,1]])

1. 원초적인 방법

가장 원초적인(?) 방법은 for 문을 이용하여 한 점씩 변환하는 것입니다. 아래와 같이 합니다.

 

ar=np.empty([0,3])

for point in points :
    ar=np.vstack([ar,np.dot(T,point)])

 

결과는 아래와 같습니다.

 

>> ar
array([[  4.,  -5.,   6.],
       [  7.,  -8.,   9.],
       [ 10., -11.,  12.],
       [ 10., -11.,  12.],
       [ 10., -11.,  12.]])

2. 행렬의 곱셈을 이용하는 방법

points 배열의 차원은 5x3 입니다. T의 차원은 3x3 입니다. 따라서 T*points 형태의 곱셈은 불가능합니다. 우리가 원하는 곱셈을 하려면 아래와 같이 points 를 transpose 해주고 T를 곱해줍니다.

 

$$ T*points^{T}=\begin{bmatrix}1 & 0 & 0 \\0 & -1 & 0 \\0 & 0 & 1 \\\end{bmatrix}\begin{bmatrix}4 & 7 & 10 & 10 & 10 &  \\5 & 8 & 11 & 11 & 11 &  \\6 & 9 & 12 & 12 & 12 &  \\\end{bmatrix}  $$

 

그런데 이렇게 되면 원래의 차원인 3x5가 아닌 5x3 형태가 되므로 다시 transpose 해주면 됩니다.

 

$$ \left( T*points^{T} \right )^{T} $$

 

위 식은 아래와 같이 변형할 수 있습니다.

 

$$ points*T^{T} $$

 

코드로 계산하면 아래와 같습니다.

 

>>> np.dot(points,T.T)
array([[  4,  -5,   6],
       [  7,  -8,   9],
       [ 10, -11,  12],
       [ 10, -11,  12],
       [ 10, -11,  12]])
반응형

댓글