본문 바로가기

코딩/데이터분석

[Python/파이썬] Numpy 기초 1편 : Array 생성 및 인덱싱,슬라이싱

반응형

※ 관련포스팅

1편 : 2021.06.29 - [코딩/Python] - [Python/파이썬] Numpy 기초 1편 : Array 생성 및 인덱싱,슬라이싱

2편 : 2021.06.30 - [코딩/Python] - [Python/파이썬] Numpy 기초 2편 : numpy의 여러가지 연산

 

 

  머신러닝을 진행하는데 있어 필요한 모듈인 Numpy를 정리해보려고 한다. 페이스북의 딥러닝 프레임워크인 Pytorch를 사용해보려고 하는데 Pytorch의 경우 Numpy랑 매우 유사한 것 같다. 이 기회에 Numpy를 공부하면 도움이 되지 않을까 싶어 정리해본다.

 

  참고로, Numpy는 벡터, 행렬 연산에 있어 많은 함수와 기능들을 제공하기 때문에 머신러닝, 딥러닝에 필요한 기초적인 라이브러리라고 한다.

 

 

 

1. 벡터(Vector), 행렬(Matrix), 텐서(Tensor) 개념

 

  딥러닝에선 차원에 대한 정보가 중요하다. Numpy를 알기 전에 한번 정리해보면 좋을 것 같아서 위와 같이 그려봤다. 3차원은 2차원 Matrix가 여러개 있는 것으로 생각하면 좋을 것 같다. 그래서 인터넷에 이미지를 찾아보면 1차원 Vetor는 한줄, 2차원 Matrix는 정사각형(평면), 3차원 Tensor는 정육각형(입체)로 표현된다.

 

  참고로, 내가 공부하고 있는 'Pytorch으로 시작하는 딥러닝 입문' 위키독스 책 저자에 따르면 1차원이든 2차원이든 딥러닝 분야에서는 텐서라고 모두 칭하고 있는 것 같다. 예를 들면, 1차원 텐서(=Vector), 2차원 텐서(=Matrix)로 말할 수 있다.

 

 

 

2. numpy array 생성

 

 

<코드>

import numpy as np

#1차원 벡터 생성 : 내부 요소는 리스트이다.
v = np.array([1,2,3,4,5])

print(v)

 

<결과>

[1 2 3 4 5]

 

-. shape와 dtype함수를 통해 생성한 array의 크기와 내부 자료형을 확인할 수 있다.

 

 

<코드>

print(v.dtype) # 내부 자료형 출력
print(v.shape) # 크기 출력 (5,) 일경우 1*5 벡터를 의미함.

 

<결과>

int32
(5,)

-. v.shape의 결과인 (5,)은 1차원 Vector의 크기가 5인 것을 나타낸다. 

-. 2차원, 3차원일 경우는 아래와 같은 결과가 출력 된다.

 

 

<코드>

v2 = np.array([[1,2],[3,4]]) #2차원 텐서(행렬) 생성
v3 = np.array([[[1,2],[3,4],[5,6]],[[1,2],[3,4],[5,6]]]) #3차원 텐서 생성

#2차원 행렬 출력
print(v2)
print(v2.shape)

#3차원 텐서 출력
print(v3)
print(v3.shape)

 

<결과>

#2차원 행렬
[[1 2]
 [3 4]]
 
#2차원 행렬 shape(2*2)
(2, 2)

#3차원 행렬
[[[1 2]
  [3 4]
  [5 6]]

 [[1 2]
  [3 4]
  [5 6]]]
  
#3차원 행렬 shape(2*3*2)
(2, 3, 2)

 

 

  다음은 텐서의 모든 요소를 0으로 채우는 zeros 함수를 통해 array를 생성해보자. 비슷한 함수로 ones 함수가 있다. ones 함수는 모든 요소를 1로 채우며 zeros 함수와 사용법이 동일하다. 사용법은 아래 zeros 사용을 통해 정리해보았다.

 

 

<코드>

print("1차원")
print(np.zeros(5))
print("\n")
print("2차원")
print(np.zeros((2,4)))
print("\n")
print("3차원")
print(np.zeros(((2,3,2))))

 

<결과>

1차원
[0. 0. 0. 0. 0.]


2차원
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]]


3차원
[[[0. 0.]
  [0. 0.]
  [0. 0.]]

 [[0. 0.]
  [0. 0.]
  [0. 0.]]]

 

 

  파이썬의 range와 동일하게 numpy에서도 array 생성시 arange라는 함수가 있다. arange 함수는 괄호 안의 첫번째 숫자부터 끝나는 숫자 전 숫자까지 Array를 생성한다. 사용법은 아래와 같다.

 

numpy.arange(시작index, 끝나는 index+1, step)

 

 

아래 예시를 보며 이해해보자. 결과를 보면 알겠지만 arange(0,4)나 range(0,4,1)이나 동일한 결과를 출력한다.

 

 

<코드>

v3 = np.arange(0,4) #0~3까지 array 생성
v4 = np.arange(0,4,1) #0~3까지 1step 단위로 array 생성
v5 = np.aragne(0,5,2) #0~5까지 2step 단위로 array 생성

print(v3)
print(v4)
print(V5)

 

<결과>

[0 1 2 3]
[0 1 2 3]
[0 2 4]

 

 

  

2. numpy array 인덱싱,슬라이싱

 

 

  1차원의 경우 파이썬의 자료형 리스트 슬라싱과 별 다를바가 없다. Numpy의 경우 2차원 3차원도 다루기 때문에 2차원, 3차원 텐서에 대한 인덱싱,슬라이싱을 정리해보고 넘어가려고 한다.

 

 

1) 1차원 텐서

 

 

<코드>

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

 

<결과>

[1 3 2 4 5 6]

 

 

위 1차원 배열을 아래와 같이 인덱싱 또는 슬라이싱할 수 있다.

 

 

<코드>

print(t1[3]) #3번째 요소 인덱싱(0번부터 시작)

print(t1[4:]) #4번째 요소부터 슬라이싱

print(t1[:3]) #3번째 요소까지 슬라이싱

print(t1[:5:2]) #~5번째 요소까지 2step으로 슬라이싱

 

<결과>

4
[5 6]
[1 3 2]
[1 2 5]

 

 

2) 2차원 텐서

 

 

<코드>

t2 = np.array([[1,2,3],[3,4,5],[6,7,8]]) #2차원 텐서(행렬) 생성
print(t2)

 

<결과>

[[1 2 3]
 [3 4 5]
 [6 7 8]]

 

 

  2차원 텐서(행렬)은 아래와 같이 인덱싱 및 슬라이싱할 수 있다. 아래에서 확인할 수 있는 내용이지만 괄호의 첫번째 요소는 행이라고 생각하면 된다.(행렬에서도 0행부터 시작)

  아래 코드를 결과와 비교하여 각 줄을 이해해보면 금방 원리를 터득할 수 있다.

 

 

<코드>

print(t2[:, 0]) #전체 차원 선택하고 0번째 인덱스만 가져오기

print(t2[:, 1]) #전체 차원 선택하고 1번째 인덱스만 가져오기

print(t2[1,2]) #1행 2번째 요소 가져오기(행도 인덱싱은 0번째 행부터 시작한다.)

print(t2[1:,1]) #1행부터~마지막행까지 1번째 인덱스 가져오기

print(t2[:1,2]) #~1행 이전까지 2번째 인덱스만 가져오기(행도 끝번호는 제외)

print(t2[:,:2]) #각 행렬의 모두 2번째 요소전까지 출력(즉 각 행의 0,1번째 인덱스)

 

<결과>

#전체 차원 선택하고 0번째 인덱스만 가져오기
[1 3 6]

#전체 차원 선택하고 1번째 인덱스만 가져오기
[2 4 7]

#1행 2번째 요소 가져오기(행도 인덱싱은 0번째 행부터 시작한다.)
5

#1행부터~마지막행까지 1번째 인덱스 가져오기
[4 7]

#~1행 이전까지 2번째 인덱스만 가져오기(행도 끝번호는 제외)
[3]

#각 행렬의 모두 2번째 요소전까지 출력(즉 각 행의 0,1번째 인덱스)
[[1 2]
 [3 4]
 [6 7]]

 

 3차원은 2차원을 이해하면 자연스럽게 이해할 수 있다.  다음 포스팅에서는 numpy의 행렬 연산, 브로드캐스팅이라는 개념에 대해 정리해 볼 예정이다.

 


참고링크

1. https://ebbnflow.tistory.com/158

 

[파이썬패키지] 딥러닝을 위한 Numpy1 - Numpy기초

● Numpy란 넘파이(Numpy)는 C로 구현된 고성능의 수치계산을 위해 제작된 파이썬 라이브러리로, 'Numerical Python'의 줄임말입니다. 넘파이는 벡터, 행렬 연산에 있어 많은 기능들을 제공하고 pandas와 ma

ebbnflow.tistory.com

 

2. '파이토치로 시작하는 딥러닝 입문' -  https://wikidocs.net/52460

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

728x90