Python 중복 list와 numpy 다차원 배열 비교

이 글은 2018.06.30일에 python 프로그래밍 언어를 기반으로, tensorflow 라이브러리와 numpy라이브러리를 활용하여 딥러닝 프로그램을 제작하는 과정에서 생긴 의문들을 해결하는 과정에서 기록한다. 특히나 numpy 라이브러리에서 다차원 배열을 어떻게 다루는지에 대해 집중 탐구했다.

#1.python 중복 list와 python numpy 의 다차원 배열의 비교

 

1) 생성 방법과 표기법

 

수학을 배우다보면 vector  -> matrix -> tensor 순으로 확장되는 개념을 배운다. 그러한 수학적 개념을 python 프로그래밍 언어에서는 list라는 개념을 이용해 표현하며, numpy 라이브러리는 그러한 list개념을 참고해 vector, matrix , tensor 수학적 표현과 연산을 python프로그래밍 언어에서 쉽게 표현하고, 다룰 수 있게 만들어진 라이브러리다.  예를 들면, 이런 식으로 표기한다.

vector_list = [ 1 , 2 , 3 , 4 , 5, 6 , 7 , 8 , 9 ]

vector_array = np.array( [ 1 , 2 , 3 , 4 , 5, 6 , 7 , 8 , 9 ] )

matrix_list = [ [1 , 2 , 3 ] , [ 4 , 5 , 6] , [7 , 8 ,9 ] ]

matrix_array = np.array( [ [1 , 2 , 3 ] , [ 4 , 5 , 6] , [7 , 8 ,9 ] ] )

tensor_list = [ [ 1 , [2 , 3 ] ] , [4 , [5 , 6] , [7 , [8 , 9] ] ]

tensor_array = np.array( [ [ 1 , [2 , 3 ] ] , [4 , [5 , 6] , [7 , [8 , 9] ] ] )

즉,중복 리스트와 numpy 다차원 배열 모두 만드는 방법과 표기 방법은 거의 동일하다. 

약간의 차이가 있다면, print 결과가 조금 다르다. list의 경우 print 해보면 원소를’ , ‘로 구분하지만 numpy array는 ‘ , ‘로 구분되어있지 않다. 아래와 같이 말이다.

list:
[[1 2 3]
[4 5 6]
[7 8 9]]

array:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

 

 

2)  하나의 원소 선택 방식(원소 추출) – 차원의 낮아짐 

 

중복 리스트와 numpy 다차원 배열 모두 동일한 방식으로 하나의 원소를 선택할 수 있다.

그리고 numpy 다차원 배열은 또 다른 하나의 방식으로 하나의 원소를 선택할 수 있다.

원소 선택시 원래 변수의 차원([ ] 개수) 보다 하나씩 낮아진다.

 

vector = [ 1 , 2 , 3 , 4 , 5, 6 , 7 , 8 , 9 ]

list, np.array : vector[ 0 ] =  1  , vector[ 1 ] =  2   .

 

matrix = [ [1 , 2 , 3 ] , [ 4 , 5 , 6] , [7 , 8 ,9 ] ]

list, np.array : matrix[ 0 ] = [ 1 , 2 , 3 ] ,  matrix[ 0 ][ 0 ] =  1  ,

np.array  :  matrix [ 0 , 0 ] = matrix [ 0 ][ 0 ] =  1

 

tensor = [ [ 1 , [2 , 3 ] ] , [4 , [5 , 6] ], [7 , [8 , 9] ]

list, np.array : tensor [ 0 ] = [ 1 , [2 , 3] ] , tensor [ 0 ][ 1 ] = [2 , 3] , tensor [ 0 ][ 1 ][ 1 ] =  3

np.array : tensor [ 0 , 1 , 1 ] = tensor [ 0 ][ 1 ][ 1 ] =  3 이다.

아마 눈치 챘겠지만, tensor 의 가장 바깥쪽에 있는 대괄호[ ] 부터 가장 안쪽에 있는 대괄호[ ] 까지  순차적으로 [index]를 추가해가며 접근하게 된다.  하지만 이러한 방법은 한번에 하나씩의 원소만 접근하기에 다수의 원소를 한번에 접근 할 수 있는 방법이 필요한데, 이 방법에 대해 살펴보자. 바로 위의 예시와 마찬가지로 , numpy라이브러리를 사용하지 않은 python list와 거의 동일한 표기법과 numpy 라이브러리 고유의 표기법 두 종류가 있다.

 

 

3)다수의 원소 선택 방식(슬라이싱) – 차원의 불변

 

list의 slicing 방법부터 정리해보자.

 

list[ start index : end index+1 ] 또는 list[ start index : end index + 1 : step ].

이런 형식으로 list의 일부분을 가져올 수 있다.

예를 들면,

list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]

list [ 1 : 3 ] = [2 , 3 ]

list [ 1 : 10 : 2 ] = [2 , 4 , 6 , 8 ]

이렇게 되는 것이다.

이제 중복 리스트와 numpy array에서 이러한 slicing 방식이 어떻게 활용되는지 예시로 살펴보자. slicing만 적용한다면 원래 변수의 차원([ ] 개수)와 동일하며, 2)처럼extraction이 적용되어야 원래 변수의 차원([ ] 개수)보다 낮아진다.

vector = [ 1 , 2 , 3 , 4 , 5, 6 , 7 , 8 , 9 ]

list, np.array : vector [1 : 10] = [2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ] , vector [2 : 4 ] = [3 , 4]

 

matrix = [ [1 , 2 , 3 ] , [ 4 , 5 , 6] , [7 , 8 ,9 ] ]

list, np.array :

matrix [ 1 : 3 ] = [ [4, 5, 6] , [7, 8, 9 ] ]   matrix [ 1 : 3 ][ 0 ] = [4, 5, 6]

matrix [ 1 : 3 ][ 0 ][ 0 : 2 ] = 4, 5             matrix [ 1 : 3 ][ 0 ][ 0 : 2 ][ 0 ] = 4

(tip. matrix [ 1 : 3 ][0 : 2 ] = [ [4, 5, 6] , [7, 8, 9 ] ] )

np.array :

matrix [ 1 : 3 , 0 ] = [ [4]  , [7] ]

matrix [ 1 : 3 , 0 : 2 ] = matrix [ 1 : 3 , [0 , 1] ]= matrix [ [1, 2 ] , [0 ,1 ] ]= [ [4 , 5] , [7, 8 ] ]

 

tensor = [ [ [ 1 ] ,[ 2 ] , [3 , 4 ] ] , [ 5 ] , [ 6 ], [7 , 8] ], [ [ 9 ] , [ 10 ] , [11 , 12] ] ]

list, np.array :

tensor [ 0 : 2 ] = [ [ [ 1 ] ,[ 2 ] , [3 , 4 ] ] , [ [ 5 ] , [ 6 ], [7 , 8] ] ]

tensor [ 0 : 2 ][ 0 ] =  [ [ 1 ] , [ 2 ] , [3 , 4 ] ]

tensor [ 0 : 2 ][ 0 ][ 2 ] = [ 3, 4 ]

tensor [ 0 : 2 ][ 0 ][ 2 ][ 1 ] = 4

np.array : 

tensor [ 0 : 1 , 0 : 3 ] =tensor [ 0 : 1 , [0 , 1 , 2] ] = [ [ [ 1 ] , [ 2 ] , [3 , 4 ] ] ]

tensor [ 0 : 2 , 0 : 2 ] = [ [ [ 1 ] ,[ 2 ] ] , [ [ 5 ] , [ 6 ] ] , [ [ 9 ] , [ 10 ] ] ]

 

 

댓글 남기기