본문 바로가기
프로그래밍/파이썬

넘파이(numpy)에서 행렬 생성

by 세인트 워터멜론 2021. 3. 11.

매트랩에 익숙한 사용자가 파이썬을 사용하게 되면 불편한 점이 몇 가지가 있는데 그 중에서도 가장 불편한 것이 행렬에 관한 것이 아닐까 싶다. 행렬 생성부터 시작하여, 부분 선택, 성분 바꾸기, 행렬 확장, 행렬 연산에 이르기까지 다 불편한 것 같다. 하지만 파이썬을 쓰려면 넘파이 스타일의 행렬에 익숙해져야 한다.

 

 

넘파이에서는 행렬을 어레이(array)로 부른다. 넘파이의 어레이 클래스는 ndarray이다. n-dimensional array란 뜻이다. 고차원 어레이가 기본인 모양이다.

차원(dimension)은 우리가 일반적으로 얘기하는 행렬의 차원이다. 예를 들어서 2차원 어레이는 \(N\)행과 \(M\)열로 이루어진 \(N \times M\) 행렬이다. 3차원 어레이는 행과 열, 그리고 깊이가 있는 \(N \times M \times L\) 행렬을 의미한다. 이런 식으로 하면 4차원 어레이는 행과 열, 깊이, 그리고 페이지로 이루어진 \(N \times M \times L \times K\) 행렬이다.

보통 행이 1개 또는 열이 1개인 \(1 \times N\) 행렬 또는 \(N \times 1\) 행렬을 벡터라고 하며 이를 1차원 행렬이라고 하는데, 넘파이 어레이에서는 이들도 모두 2차원 어레이로 분류한다. 1차원 어레이는 행이나 열 표시없이 \(N\)개의 성분으로 구성된다.

넘파이에서는 차원을 axis 라고 부른다. axis=0 은 행이며, axis=1 은 열, axis=2 는 깊이, 이런 순서로 나간다.

 

 

먼저 \(2 \times 3\) 행렬 \(A\) 를 생성해 보자.

 

\[ A= \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \]

 

어레이를 생성하려면 np.array 함수를 사용한다.

 

import numpy as np

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

 

넘파이 어레이에서 대괄호 기호 [ ]는 어레이(행렬)의 한 행으로 이해하면 된다. 그리고 대괄호 안의 성분은 열(column) 성분을 나타낸다고 보면 된다. 그래서 \(A\)는 바깥쪽 대괄호 안에 두개의 대괄호가 있는데 바깥쪽 대괄호는 어레이 시작, 안쪽의 첫번째 대괄호는 어레이의 첫번째 행, 두번째 대괄호는 두번째 행을 나타낸다. 어레이가 몇차원인지 알고 싶으면 ndarray.ndim 을, 각 axis의 길이(즉 행렬의 모양)를 알고 싶으면 ndarray.shape 를 이용한다.

 

print(A.ndim, A.shape)

 

결과는 2 와 (2,3) 이 나온다.

이번에는 다음과 같이 행벡터와 열벡터를 생성해 보자.

 

\[ a= \begin{bmatrix} 1 & 2 & 3 \end{bmatrix} , \ \ b= \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} \]

 

a = np.array([[1,2,3]])
b = np.array([[1], [2], [3]])
c = np.array([1, 2, 3])

 

여기서 c를 보면 대괄호가 1개 있다. 이렇게 하면 1차원 어레이가 생성된다. 차원을 보면

 

print(a.ndim, b.ndim, c.ndim)

 

a와 b는 2차원, c는 1차원이다. 어레이의 모양을 보면

 

print(a.shape, b.shape, c.shape)

 

a는 (1,3), b는 (3,1), c는 (3, ) 이라고 나온다. 성분이 모두 0인 어레이는 np.zeros를 이용하여 생성한다. 다음은 1차원 어레이, 2행3열의 2차원 어레이를 생성하는 예이다. 소괄호가 두 개가 있음에 주의해야 한다.

 

d1 = np.zeros(2)
d2 = np.zeros((2,3))

print("d1=", d1, "\nd2=", d2)

 

성분이 모두 1인 어레이는 np.ones를 이용하여 생성한다. 다음은 1차원 어레이, 3행2열의 2차원 어레이를 생성하는 예이다.

 

e1 = np.ones(2)
e2 = np.ones((3,2))

print("e1=", e1, "\ne2=", e2)

 

 

 

댓글