안녕하세요 :) 이번에 다뤄볼 분야는 linear algebra(선형대수)입니다. 사실 python 자체 내에서 지원해주는 전문적인 수학 라이브러리는 없습니다. 하지만, python의 가장 강점인 다양한 library중 가장 강력하고 많이 사용되는 Numpy라는 라이브러리가 있습니다. 이 라이브러리는 기본적인 선형대수나 푸리에 변환, 난수 등을 지원하고, 특히나 모든 다른 수학과 과학 라이브러리의 기본이 되는 데이터 구조(N-dimensional array)를 지원합니다. Data mining이나 data analysis에 기본이 되는 데이터를 다루는 데에 있어서 굉장히 중요한 container가 되는 셈이죠. 이 Numpy라이브러리를 사용하여 선형대수의 기본적인 방정식의 해를 구하는 예제를 풀어보겠습니다.

다음과 같은 방정식들이 있습니다. \[\begin{aligned} 3x+6y-5z&=12\newline x-3y+2z&=-2\newline 5x-y+4z&=10\end{aligned}\]

이를 선형대수의 형태로 치환하면, \[\left[\begin{array}{ccc} 3&6&-5\newline 1&-3&2\newline 5&-1&4\end{array}\right] \left[\begin{array}{c} x\newline y\newline z \end{array} \right] =\left[\begin{array}{c} 12\newline -2\newline 10 \end{array} \right] \] 가 됩니다. 그럼 먼저 어떻게 행렬을 numpy를 이용해 선언하는지 살펴봅시다. 먼저 numpy를 사용하기 위해서 우리는 라이브러리를 import해 줍니다. as를 통해서 numpy를 다 쓰지 않고 np만으로 간단하게 줄여서 사용할 수 있게 됩니다.

>>> import numpy as np

>>> A = np.array([[3, 6, -5],
             [1, -3, 2],
             [5, -1, 4]])
>>> print A
[[ 3  6 -5]
 [ 1 -3  2]
 [ 5 -1  4]]

>>> b = np.array([12, -2, 10])
>>> print b
[12 -2 10]

잘 선언되어 있음을 확인하실 수 있죠? 그럼 이제 $Ax=b$의 상태에서 $x$를 구하는 방법은 다들 아시겠지만, \[x=A^{-1}b\] 가 되기 때문에 이를 numpy 라이브러리를 이용해서 풀면,

>>> x = np.linalg.inv(A).dot(b)
>>> print(x)
[ 1.75  1.75  0.75]

아주 손쉽게 구할 수 있음을 확인할 수 있죠? 참고로 np.linalg.inv(A)만으로 $A$의 역행렬을 구할 수 있고, 여기에 .dot(b)를 연속적으로 사용함으로써 역행렬과 $b$의 dot product를 구할 수 있게 됩니다.

실제로 np.matrix의 데이터 구조를 사용하면 syntax적으로 더 쉽게 사용할 수도 있지만, np.array가 워낙 일반적으로 많이 사용되기 때문에, 그리고 n차원까지도 쉽게 확장되기 때문에 이것을 사용하는 것을 권장해 드립니다 :)