리스트 차원 확인 - liseuteu chawon hwag-in

오늘 할 얘기는 초급은 아니지만 굳이 중급이라고 하기도 뭣한; 얘기라 그냥 하겠습니다. ^^;

말그대로 리스트 안에 리스트가 있다는 건데요.

예를 들어 봅시다.

1, 2, 3을 원소로 갖는 어떤 리스트가 있다고 해봅시다.

또 4, 5, 6을 원소로 갖는 어떤 리스트가 있다고 해봅시다.

그런데 이제 c라는 리스트가 있어서, 위의 두 리스트를 각각 항목으로 갖는다고 해볼게요.

c = [ [1, 2, 3], [4, 5, 6] ]

그러면 위와 같이 쓰면 됩니다. (띄어쓰기는 상관없어요)

이 리스트 c의 항목은 [1, 2, 3], [4, 5, 6] 두 개입니다.

>>> c = [ [1, 2, 3], [4, 5, 6] ] >>> len(c) 2

len() 함수로 c의 길이를 확인해 보면 2라고 알려주지요. 즉 c에 들어 있는 항목이 두 개밖에 없다는 것입니다.

>>> c[0] [1, 2, 3] >>> c[1] [4, 5, 6]

c[0]를 써서 c의 첫번째 항목이 뭐냐고 찍어보니 [1, 2, 3]이라고 합니다.

c[1]을 써서 c의 두번째 항목이 뭐냐고 찍어보니 [4, 5, 6]이라고 합니다.

이렇게 별 것 없는 얘기를 하는 이유는, 이게 다차원 배열이기 때문입니다.

갑자기 어려운 단어가 뙇 나왔네요 ^^;

다차원은 여러 겹이라는 뜻이고, 배열은 array, 나열이라는 뜻입니다.

[1, 2, 3] <- 이렇게 숫자가 1차원으로 나열된 것은 일차원 배열입니다.

[ [1, 2, 3], [4, 5, 6] ] <- 이렇게 리스트 안에 리스트로 배열된 건 2차원 배열입니다.

[ [[1], [2], [3]], [[4], [5], [6]] ] <- 3차원 배열이겠지요.

>>> c = [ [[1], [2], [3]], [[4], [5], [6]] ] >>> c[0] [[1], [2], [3]] >>> c[0][0] [1] >>> c[0][0][0] 1

c는 3차원 배열입니다.

c의 첫번째 항목을 알아보기 위해 c[0]이라고 써봤습니다.

그랬더니 [[1], [2], [3]] 라고 하네요.

c[0]의 첫번째 항목을 알아보기 위해 c[0][0]이라고 써봤습니다.

그랬더니 [1] 라고 하네요.

c[0][0]의 첫번째 항목을 알아보기 위해 c[0][0][0]이라고 써봤습니다.

그랬더니 1 이라고 하네요.

>>> c[0][0][0][0] Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> c[0][0][0][0] TypeError: 'int' object is not subscriptable

c는 3차원 배열이니까 c[0][0][0]까지밖에 없습니다.

c[0][0][0][0]을 물어보면 에러납니다.

다른 것도 해볼까요?

왜 6이 나오는지 잘 생각해 보세요.

(리스트의 첫번째 항목은 0번째로 시작한다고 앞에서 배웠습니다.)

>>> c = [ [[1, 2], [2, 4], [3, 6]], [[4], [5], [6]] ] >>> c[0][0][0] 1 >>> c[0][0][1] 2 >>> c[0][1][0] 2 >>> c[0][1][1] 4

이런 식으로 원소를 더 넣어도 됩니다. 꼭 개수를 맞출 필요는 없지요.

앞에서부터 4개를 찍어봤습니다.

차원을 구분하는 게 헛갈릴 수 있는데, 밖에서부터 []를 하나씩 지우면서 쉼표를 확인해 보면 그나마 쉽게 알 수 있습니다 ^^;

사실 파이썬에서 다차원 배열이란 그냥 []가 하나 더 있다는 것 뿐인데요,

어렵게 느끼시는 분이 많아서 정리해 보았습니다.

다차원 배열은 numpy(넘파이)라고 하는, 파이썬의 계산 및 통계 라이브러리에서 자주 사용됩니다.

pandas(판다스)라고 하는, 데이터 분석 라이브러리에서도 자주 나오는 개념입니다.

물론 tensorflow(텐서플로)라는 인공지능 라이브러리에서도 다차원배열의 rank와 shape는 기본적으로 알아야 합니다. (차원이 몇 개인지의 얘기입니다)

# 1. ndarray.shape : 몇 행 몇 열인지 반환

# 3개 원소 배열 -> (3, ) 반환

arr_3 = np.array([0, 1, 2])

arr_3.shape # (3, )

# 2x3 배열 -> (2, 3) 반환

arr_2x3 = np.array([ [11, 12, 13], [21, 22, 23] ])

arr_2x3.shape  # (2, 3)

# 2x3x2 배열 -> (2, 3, 2) 반환

arr_2x3x2 = np.array( [ [ [111, 112], [121, 122], [131, 132] ], [ [211, 212], [221, 222], [231, 232] ] ] )

arr_2x3x2.shape  # (2, 3, 2)

# 2. ndarray.ndim : 몇 차원인지 반환

# 3개 원소 배열(1차원) -> 1 반환

arr_3 = np.array([0, 1, 2])

arr_3.ndim # 1

# 2x3 배열(2차원) -> 2 반환

arr_2x3 = np.array([ [11, 12, 13], [21, 22, 23] ])

arr_2x3.ndim # 2

# 2x3x2 배열(3차원) -> 3 반환

arr_2x3x2 = np.array( [ [ [111112][121122][131132] ][ [211212][221222][231232] ] ] )

arr_2x3x2.ndim # 3

# 3. ndarray.size : 전체 원소의 개수 반환

# 3개 원소 배열 -> 3 반환

arr_3 = np.array([0, 1, 2])

arr_3.size # 3

# 2x3 배열 -> 6 (총 원소 개수 = 2x3 = 6개) 반환

arr_2x3 = np.array([ [11, 12, 13], [21, 22, 23] ])

arr_2x3.size # 6

# 2x3x2 배열 -> 12 (총 원소 개수 = 2x3x2 = 12개) 반환

arr_2x3x2 = np.array( [ [ [111112][121122][131132] ][ [211212][221222][231232] ] ] )

arr_2x3x2.size # 12

# 4. len(ndarray) : 첫 번째 차원의 갯수(행수) 반환

# 3개 원소 배열 -> 3 (첫 번째 차원 : 3개) 반환

arr_3 = np.array([0, 1, 2])

len(arr_3) # 3

# 2x3 배열 -> 2 (첫 번째 차원 행수 : 2개) 반혼

arr_2x3 = np.array([ [11, 12, 13], [21, 22, 23] ])

len(arr_2x3) # 2

# 2x3x2 배열 -> 2 (첫 번째 차원 행수 : 2개) 반환

arr_2x3x2 = np.array( [ [ [111112][121122][131132] ][ [211212][221222][231232] ] ] )

len(arr_2x3x2) # 2

#------------------------------------------------------------------------------------------#

# 헷갈리는 size와 len

1. size

   : 전체 원소의 갯수!

   : 2x3 배열의 경우, 원소 개수인 6을 반환!

2. len

   : 첫 번째 차원의 원소(행) 수!

   : 2x3 배열의 경우, 첫 번째 차원의 행수인 2를 반환!

   : [1, 2, 3] 같은 1차원 배열의 경우, shape가 (3, )이므로 첫 번째 차원의 행수인 3을 반환한다고 봐도 될 듯.

# 참고 사항

1. len(객체)는 파이썬 내장 함수

   : 파이썬 기본 리스트(list)나 문자열에도 사용 가능!

3. shape, ndim, size는 numpy.ndarray객체의 메서드

   : 파이썬 기본 리스트(list)나 문자열에선 사용 불가! (numpy.ndarray에서만 사용 가능)

Toplist

최신 우편물

태그