본문 바로가기

데이터/numpy

[numpy] 넘파이 기초

Numpy

 

 

 


  • Numerical Python의 약자
  • 다양한 수학 연산과 다차원 데이터를 쉽게 다루기 위한 파이썬 라이브러리
  • Numpy는 ndarray라고 하는 특별한 객체를 사용
    • 리스트와 달리 고정된 크기를 갖는다.
    • 같은 타입의 데이터만 저장 가능.
  • ndarray는 python 리스트에서 지원하지 않는 다양한 기능들을 지원
    • 효율적으로 코드 작성 가능
    • 더 빠른 속도

 

 

 

혹시나 데이터분석, 머신러닝, 딥러닝등을 조금이라도 다뤄보았다하면 한 번쯤 마주치는 녀석이 바로 이 Numpy 라는 녀석일 것이다. 

 

Numpy는 수학 및 과학 연산 등을 처리하기 위해 개발된 패키지로

다양한 행렬 연산 뿐 아니라 여러 간단한 통계, 수치해석 기능을 유용하다고 한다.

 

 

 

 

Numpy import 

 

 

 

numpy는 파이썬에서 기본적으로 제공되는 내장 모듈이 아니기 때문에, 만약 사용하고 싶다면 먼저 설치를 해줘야한다.

 

 

!pip install numpy

 

 

다양한 파이썬 IDE 등을 사용하겠지만 나는 Jupyter notebook 을 사용하므로 Jupyter Notebook에 맞게끔 진행하겠다.

위의 명령어를 통해서 numpy 라이브러리를 설치할 수 있다.

만약 설치가 되었다면 numpy를 불러오자.

 

 

import numpy as np

 

 

관례적으로 numpy 모듈은 np라는 별칭(alias)을 이용하기 때문에

다른 별칭으로 사용하고 싶은 사람들은 np 대신 다른 별칭을 사용해도 된다.

 

 

 

np.__version__

 

 

위의 명령어로 numpy의 버전을 확인할 수 있다.

 

 

 

 

 

 

 

리스트로 배열 생성

 

 

 

1,2,3 차원 Numpy 객체

 

 

 

 

일반적으로 python List를 다룰 때처럼, numpy의 ndarray도 비슷한 형태를 가진다.

 

 

1D array의 경우 단일 row를 갖는 array 이고 

 

2D array의 경우 차원 하나가 늘어나 row와 column 을 표현할 수 있는데

보통 axis=0 은 행을 의미하고, axis=1은 열을 의미한다.

이는 pandas에서도 자주 마주칠 수 있다.

 

3D array의 경우 axis=2를 담당하는 축이 하나 더 늘어난 형태인데 Depth를 의미한다.

 

 

 

 

 

 

 

  • 1차원 객체

 

a1 = np.array([1,2,3,4,5])
print(a1)
print(type(a1))
print(a1.shape)
print(a1[0], a1[1], a1[2], a1[3], a1[4])

 

코드 실행 결과 1

 

 

 

[1,2,3,4,5] 가 담긴 list를 np.array() 안에 인자로 넘겨주게 되면

numpy.ndarray 라는 클래스를 갖는 객체가 생성된다.

 

 

a1.shape 은 ndarray 객체의 형태를 확인할 수 있는데 (5, ) 가 찍히는 것을 확인할 수 있다.

이는 1차원을 의미하며 1차원안에 5개의 값이 존재한다고 볼 수 있으며 차원이 늘어날수록 콤마 뒤의 숫자가 늘어나게 된다.

여기서 숫자 5뒤에 콤마가 왜 찍히는지 의아할 수 있는데 

개인적인 생각으로는 튜플과 유사하다고 생각한다.

 

 

 

a = (5)
print(type(a))

b = (5,)
print(type(b))

 

 

위처럼 코드를 작성하고 결과를 실행시켜보면 이러한 형식으로 나오게 된다.

 

코드 실행 결과 2

 

 

따라서 차원을 표시하기 위해 콤마를 찍었다고 생각한다.

 

 

List와 유사하게 인덱스로 ndarray 객체의 원소에 접근할 수 있다.

List처럼 인덱스 0부터 시작한다.

 

 

 

 

 

 

 

 

  • 2차원 객체

 

a2 = np.array([[1,2,3], [4,5,6]])
print(a2)
print(a2.shape)
print(a2[0,0], a2[1,1])

 

코드 실행 결과 3

 

 

 

2차원 객체를 생성하기 위해서는 List 안의 원소가 List 형태로 존재하면 된다.

일반적으로 쉽게 구분하기 위해서 나는 맨 앞 대괄호의 개수를 세어서 확인한다.

 

 

a2.shape 을 찍어보면 1D array와 달리 숫자가 2개 찍히는 것을 확인할 수 있다.

 

 

2D array 의 원소에 접근하기 위해서는

인덱싱 안에 row와 column 의 인덱스를 적어서 접근할 수 있다.

a2[0, 0]은 첫 번째 row와 첫 번째 column에 접근한다는 의미이고

a2[1, 1]은 두 번째 row와 두 번째 column에 접근한다는 의미이다.

 

 

 

 

 

 

 

  • 3차원 객체

 

 

a3 = np.array([[[1,2,3,4], [4,5,6,7], [9,0,1,2]], [[3,4,5,6], [7,8,9,0], [1,2,3,4]]])
print(a3)
print(a3.shape)

 

 

코드 실행 결과 4

 

 

 

3D array도 마찬가지로 차원이 늘어날수록 대괄호의 수가 늘어나며,

 

 

a3.shape을 찍어보면 (2,3,4)가 찍히게 되는데

큰 덩어리가 2개, 각 덩어리별로  row가 3개이며, column이 4개임을 확인할 수 있다.

 

 

 

 

 

 

 

배열 생성 및 초기화

 

 

 

특정한 배열을 만들기 위해서 다양한 메소드를 사용할 수 있다.

 

 

 

  • zeros() : 모든 요소를 0으로 초기화
np.zeros(10)

 

코드 실행 결과 5

 

 

 

 

  • np.ones() : 모든 요소를 1로 초기화
np.ones((2,3))

코드 실행 결과 6

 

ones() 안에 (2,3)의 shape 형태를 넣어줌으로써 모든 원소가 1로 구성된 2행 3열 짜리 행렬을 생성할 수 있다.

 

 

 

 

 

 

  • np.full() : 모든 요소를 지정한 값으로 초기화
np.full((2,3), 5)

 

코드 실행 결과 7

 

 

full() 안에 shape의 형태와 원하는 값을 인자로 전달한다.

 

 

 

 

 

 

  • np.eye() : 단위행렬(identity matrix) 생성
np.eye(5)

 

코드 실행 결과 8

 

 

 

 

 

  • np.tri() : 삼각행렬 생성
np.tri(5)

 

코드 실행 결과 9

 

 

 

 

 

 

  • _like() : 지정된 배열과 shape이 같은 행렬 생성
np.zeros_like(a1)
np.ones_like(a1)
np.full_like(a1, 10)

 

코드 실행 결과 10

 

 

기존의 zeros, ones, full 과 동일하게 0과 1, 원하는 원소로 배열을 생성하는 대신

원하는 shape을 가진 배열을 인자로 전달하면

해당 배열의 shape과 동일한 행렬을 생성한다.