-
[ NumPy_2] 차원 크기 모양 / 다차원 인덱싱 슬라이싱NAN/Python 2021. 6. 29. 21:33728x90
배열의 차원, 크기, 모양
앞서 소개했듯이 NumPy 이는 차원을 다루는 라이브러리이다. 차원이라는 말이 조금 낯설게 느껴지기도 하고
n차원이라는 표현에 머리가 어지러워지지만 간단하게 생각하면,
1차원은 직선 그래프, 2차원은 x와 y로 구성된 평면 그래프이고 3차원은 그 평면 그래프에 선을 하나 더 데어
박스 형태를 갖게끔 한다고 이미지화 시키면 보다 이해가 편하다.
차원 개념
import numpy as np arr = np.array([[[0,1,2,3,4], [5,6,7,8,9]], [[10,11,12,13,14], [15,16,17,18,19]], [[20,21,22,23,24], [25,26,27,28,29]], [[30,31,32,33,34], [35,36,37,38,39]]]) print(arr) [[[ 0 1 2 3 4] [ 5 6 7 8 9]] [[10 11 12 13 14] [15 16 17 18 19]] [[20 21 22 23 24] [25 26 27 28 29]] [[30 31 32 33 34] [35 36 37 38 39]]]
차원을 표현하는 방법은 (차원)dimnsion, (크기) size, (모양) shape 총 세 가지가 있고, 예시와 같은 배열을 가진 차원을
표현할 때에는 dimension = 3차원 size = (4 * 2 * 5) 40 shape = (4, 2, 5)라고 표현해준다.
사이즈는 0차원 1차원 2차원을 한 번씩 곱한 값이다.
차원이 많이지고 데이터가 많아질수록 차원을 한눈에 알아보기 어렵기 때문에,
각각의 값을 알아볼 수 있는 함수역시 존재한다.
ndim
ndarray.ndim은 배열의 축 개수 또는 차원을 알려주는 함수이다.
import numpy as np arr = np.array([[[0,1,2,3,4], [5,6,7,8,9]], [[10,11,12,13,14], [15,16,17,18,19]], [[20,21,22,23,24], [25,26,27,28,29]], [[30,31,32,33,34], [35,36,37,38,39]]]) arr.ndim 3
size
ndarray.size는 배열의 총 원소 수를 알려준다.
import numpy as np arr = np.array([[[0,1,2,3,4], [5,6,7,8,9]], [[10,11,12,13,14], [15,16,17,18,19]], [[20,21,22,23,24], [25,26,27,28,29]], [[30,31,32,33,34], [35,36,37,38,39]]]) arr.size 40
shape
ndarray.shape는 배열의 각 차원에 따라 저장된 원소 수를 나타내는 정수를 튜플 형태로 표시한다.
import numpy as np arr = np.array([[[0,1,2,3,4], [5,6,7,8,9]], [[10,11,12,13,14], [15,16,17,18,19]], [[20,21,22,23,24], [25,26,27,28,29]], [[30,31,32,33,34], [35,36,37,38,39]]]) arr.shape (4,2,5)
배열 형태 변경하기
shape를 통해 각 배열의 원소 수를 알 수 있었다면, reshape는 원소를 재배열하는 기능을 가지고 있다.
단, 이 기능을 사용하고자한다면 지켜야 할 규칙이 있는데
변경 전, 후 배열의 원소 숫자는 동일해야 한다는 점이다, 다시 말해 배열의 size는 변할 수 없다.
arr1 = np.arange(6) print(arr1) print() arr2 = arr1.reshape(3,2) print(arr2) [0 1 2 3 4 5] [[0 1] [2 3] [4 5]] arr2 = arr1.reshape(3,-1) print(arr2) [[0 1] [2 3] [4 5]]
1차원 배열이었언 array가 reshape를 통해 3행 2열의 2차원 형태로 재배치됐지만, 원소 사이즈는 기존과 동일하다.
numpy.reshape(array, newshape, order='A', 'F', 'C')의 형태로 사용해도 동일하게 적용되는데,
선택사항 order를 사용하고자 한다면 A,F,C 중 하나를 선택해야 한다. C는 C언어 방식,
F는 Fortran, A는 메모리에 따라 C 또는 Fortran으로 자동 선택된다.
마지막으로 reshape(3,-1)의 형태를 사용하면 기존 배열의 길이와, 남은 차원에서 유추하여 자동으로 형태 변경이 된다.
resize
배열의 형태를 바꾸는 게 아닌 원소를 재조정하고 싶다면, resize를 통해 해결할 수 있다.
다차원 인덱싱
파이썬의 list와 마찬가지도 numpy이 또 한 인덱싱과 슬라이싱을 지원한다.
1차원의 경우 사용 방법이 동일하지만 2차원, 3차원으로 넘어가게 되면 조금 까다로워지는데
그 이유는 축이 새롭게 추가되기 때문이다.
import numpy as np arr = np.arange(10).reshape(2,5) print(arr) print() print(arr[1, 3]) print() print(arr[1, -1]) print() print(arr[0]) print() print(arr[0][2]) [[0 1 2 3 4] [5 6 7 8 9]] 8 9 [0 1 2 3 4] 2
이렇게 먼저 행을 정하고 열을 지정하여 각 원소를 배열하는 형태로 사용할 수 있다.
단 2차원 이상 배열에서 행만 지정하고 열을 표기하지 않으면 자동으로 해당 열을 모두 출력한다.
이해를 돕기 위해 list에서 인덱싱을 하는 방식과 동일하게 적용했지만,
numpy 이에서는 인덱싱을 할 때에는 한 번에 연산하여 값을 가져올 수 있도록
arr [][]의 형태가 아닌 arr[ , ] 형태로 사용하자
다차원 슬라이싱
import numpy as np arr = np.arange(20).reshape(5,4) print(arr) print() print(arr[0:4,1]) print() print(arr[:,1]) print() print(arr[0:3,:]) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19]] [ 1 5 9 13] [ 1 5 9 13 17] [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
슬라이싱의 기본 개념은 동일하다 arr [0:4,1]을 풀어 설명하자면 0부터 3까지의 행에서 1번 열을 불러오라는 의미이고
arr[ : , 1]의 경우 전체 행에서 1번 열을 가져오라는 의미이다. 마지막으로 arr [0:3, : ]는 0부터 2까지의 행에 전체 열을
불러오라는 의미이기 때문에 예시와 같이 출력이 되었다.
그 외의 방법
인덱싱, 슬라이싱 외에도 원하는 값을 불러오는 방법이 있는데 논리 연산자를 사용하는 것이다.
import numpy as np arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) print(arr[arr < 5]) print() arr5 = (arr >= 5) print(arr[arr5]) print() arr2 = arr[(arr > 2) & (arr < 11)] print(arr2) [1 2 3 4] [ 5 6 7 8 9 10 11 12] [ 3 4 5 6 7 8 9 10]
'NAN > Python' 카테고리의 다른 글
[NumPy_4] 기존 데이터에서 배열 만들기 / 배열 연산 (0) 2021.06.30 [NumPy_3] 배열의 차원 확장 (0) 2021.06.30 [NumPy_1] 소개 / 배열 만들기 / 원소 다루기 (0) 2021.06.29 [Python] 모듈 (0) 2021.06.24 [Python] Class (0) 2021.06.20