티스토리 뷰

반응형

NumPy에는 다차원 행렬인 배열(array)와 2차원 행렬(matrix)가 있다.

Matrix와 array 사이에 차이가 있을까? 해서 이런 저런 자료를 보다보니, 다음 코드의 실행 결과를 비교하는 글을 보았다.

import numpy as np
a1x4 = np.array([1, 2, 3, 4])
print('Array:')
print(a1x4)
print(a1x4.shape)

m1x4 = np.mat([1, 2, 3, 4])
print('Matrix:')
print(m1x4)
print(m1x4.shape)

결과는 다음과 같을 것이다.

Array:
[1 2 3 4]
(4,)
Matrix:
[[1 2 3 4]]
(1, 4)

Array는 1차원 배열을 생성하지만, matrix는 2차원 배열로 생성이 된다. 물론, array도 다음과 같이 하면, 2차원 배열로 생성할 수 있다.

import numpy as np
a1x4 = np.array([[1, 2, 3, 4]])
print('Array:')
print(a1x4)
print(a1x4.shape)

위 코드 실행 결과는 다음과 같다.

Array:
[[1 2 3 4]]
(1, 4)

다만, matrix의 가장 큰 장점은 직관적인 코드 작성이 가능하다는 것 같다.

예를 들어, 역행렬을 얻고 싶을 때 linalg.inv()를 활용하면 다음과 같다.

import numpy as np
from numpy import linalg
a2x2 = np.array([[1, 2], [3, 4]])
print('Inv. Array:')
print(a2x2)
print(linalg.inv(a2x2))

m2x2 = np.mat([[1, 2], [3, 4]])
print('Inv. Matrix:')
print(m2x2)
print(linalg.inv(m2x2))

위 코드의 결과는 다음과 같다.

Inv. Array:
[[1 2]
 [3 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]
Inv. Matrix:
[[1 2]
 [3 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]

Matrix를 활용한다면 다음과 같이 쓸 수 있다.

import numpy as np
m2x2 = np.mat([[1, 2], [3, 4]])
print('Inv. Matrix:')
print(m2x2)
print(m2x2.I)

예상 가능하겠지만, np.array를 활용해서 a2x2.I와 같이는 쓸 수 없다. np.mat가 필요하다. 위 코드의 실행 결과는 다음과 같다.

Inv. Matrix:
[[1 2]
 [3 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]

구해진 역행렬과 행렬을 곱하면 다음과 같다.

import numpy as np
m2x2 = np.mat([[1, 2], [3, 4]])
print('Unit. Matrix:')
print(m2x2)
print(m2x2.I)
print(m2x2 * m2x2.I)

위 코드의 결과는 다음과 같다.

Unit. Matrix:
[[1 2]
 [3 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]
[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]

Array에서 *를 사용하면 다음과 같다.

import numpy as np
from numpy import linalg
a2x2 = np.array([[1, 2], [3, 4]])
print('Unit. Array:')
print(a2x2)
print(linalg.inv(a2x2))
print(a2x2 * linalg.inv(a2x2))
print(np.dot(a2x2, linalg.inv(a2x2)))

위 코드를 실행하면 다음과 같다.

Unit. Array:
[[1 2]
 [3 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]
[[-2.   2. ]
 [ 4.5 -2. ]]
[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]

배열(Array)에 * 연산을 수행하면, 각 항끼리 곱해버리는 것을 알 수 있다. 내적을 하려면 np.dot을 이용해야 한다. np.mat에 대해서도 np.dot 연산은 당연히 가능하다.

행렬에서 각 항끼리 곱을 하고 싶다면, np,multiply를 활용할 수 있다.

import numpy as np
m2x2 = np.mat([[1, 2], [3, 4]])
print('Unit. Matrix:')
print(m2x2)
print(m2x2.I)
print(m2x2 * m2x2.I)
print(np.multiply(m2x2, m2x2.I))

결과는 다음과 같다.

Unit. Matrix:
[[1 2]
 [3 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]
[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]
[[-2.   2. ]
 [ 4.5 -2. ]]

전치행렬은 다음과 같이 구할 수 있다. H나 T로 구할 수 있다.

import numpy as np
m2x2 = np.mat([[1, 2], [3, 4]])
print('Trans. Matrix:')
print(m2x2)
print(m2x2.H)
print(m2x2.T)

실행결과는 다음과 같다.

Trans. Matrix:
[[1 2]
 [3 4]]
[[1 3]
 [2 4]]
[[1 3]
 [2 4]]

행렬 생성을 문자열로 할 때는 세미콜론(;)을 활용한다.

import numpy as np
m2x2 = np.mat('1 2; 3 4')
print(m2x2)

오늘은 간단하게 np.array와 np.mat를 비교해보았다.

반응형
댓글