컴퓨터 못만지는거/야금야금 Python

파이썬 행렬 연산하기 (array, matrix)

김무명01 2020. 1. 17.

파이썬 행렬 더하기, 빼기, 곱하기.

파이썬에서 행렬 연산을 하기 위해서 해야되는 것들.

 

1. numpy 패키지 설치

    anaconda prompt를 띄우고 pip install numpy

 

numpy 패키지 없이 그냥 array로 만들어 봤더니 연산하는 게 시원찮고 손이 더 많이 갔다.

numpy를 import하면 아주 간단하게 끝나는 것들이 간단하게 끝나지 않았음.

여러모로 numpy는 그냥 기본 패키지다 생각하고 파이썬을 설치하자마자 묻지도 따지지도 말고 일단 다운받는 게 좋은 것 같다. 

 

 

1
2
3
4
5
6
7
8
9
import numpy as np #패키지 불러오기
 
= np.mat([[12],
            [34]]) #np.mat대신 np.matrix를 써도 같음.
= np.mat([[15],
            [51]])
 
print(a+b) #행렬 더하기
print(a*b) #행렬 곱
 
 

패키지를 불러들여온다. 

np.mat을 쓰나 np.matrix를 쓰나 동일하다.

 

np.array를 써봤는데 np.array는 행렬 곱셈을 하는 경우에는 좀 더 귀찮은 것 같다.

matrix를 쓰면 단순하게 a*b로도 해결되는데,

array 명령어로 데이터를 받으니 내가 생각한 것과는 다른 결과가 나왔다.

 

행렬 곱셈에 있어서는, np.array로 a*b를 계산하면 이런 결과가 나온다.

 

행렬 곱셈 연산을 수행하는 게 아니라 그냥 같은 자리에 있는 원소들끼리 곱해버림 ㅋㅋㅋㅋㅋㅋㅋㅋ

 

 

 

단순 더하기, 빼기만 있거나,

곱셈을 할 행렬이 왼쪽 오른쪽으로 대각선 성분만 가지고 있는 행렬이면 array로 받든 mat로 받든 결과에 아무 상관이 없다.

진짜 의미의(?) 행렬 연산을 해야되는 경우 데이터를 np.mat으로 받는게 제일 편하다.

 

 

a와 b를 np.array()로 받았을 때 결과

[[ 1 10]
 [15  4]]

 

a, b를 matrix로 받았을 때, print(a*b)의 결과. (수학적으로 맞는 행렬 곱하기)

[[11  7]
 [23 19]]

 


 

더하기는 같은 위치에 있는 원소들끼리 더해주면 되는거라 array로 하든 matrix로 하든 결과는 똑같다.

[[2 7]
 [8 5]]

행렬 뺄셈 print(a-b)의 결과. 예상했지만 당연히 된다.

[[ 0 -3]
 [-2  3]]

 

이미 데이터를 array로 받았을 때, mat으로 바꾸기

a = np.asmatrix(a)

 


 

 

(1) 역행렬 구하기 (inverse)

1
2
print(a.I)
print(a*a.I)
cs

혹은 numpy.linalg.inv(a)

 

결과

[[-2.   1. ]
 [ 1.5 -0.5]]
[[1.00000000e+00 1.11022302e-16]
 [0.00000000e+00 1.00000000e+00]]

 

E-16이면 컴퓨터는 어차피 못읽어서 0이나 다름없어서 굳이 안 건드려도 될 것 같기는 한데 표시되는 포맷이 마음에 들게 나오지는 않는다.

인건 맞는데, 다음에 찾아보고 해결하든지 말든지 해봐야지. 

 

 

 

(2) 행렬 전치 (transpose)

1
print(a.T)
cs

결과

[[1 3]
 [2 4]]

 

 

 

 


그 외

NxN 단위 행렬 만들기 np.eye(N)

 

행렬의 determinant 구하기 np.linalg.det(a)

 

행렬의 eigenvalues만 구하기 np.linalg.eigvals(a)

 

행렬의 eigenvalues, eigenvectors 구하기 np.linalg.eig(a)

첫번째 array에 출력되는 게 > eigenvalue

두번째 matrix에 출력되는 게 > eigenvectors.

댓글