반응형
아래와 같이 여러개의 점이 하나의 배열에 들어 있습니다.
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]])
반응형
'머신러닝을 위한 파이썬 기초 > 넘파이' 카테고리의 다른 글
[파이썬 numpy] 비어있는 배열 만들고 원소 추가하기 (3) | 2024.10.13 |
---|---|
[파이썬 numpy] 벡터와 행렬의 연산 이해하기 (0) | 2024.10.12 |
파이썬 넘파이 1차원 열벡터로 바꾸는 방법 (0) | 2023.10.26 |
[파이썬 넘파이] 크기, 차원, 행 수, 전체 원소 수 (0) | 2023.10.11 |
[파이썬 넘파이] 반올림, 올림, 버림 (0) | 2023.10.11 |
댓글