-
NumPy 한번에 끝내기 02 - 데이터 과학 핵심 도구 (배열 조회/인덱싱/삽입/수정/삭제/복사)빅데이터/NumPy 2022. 1. 18. 15:50
유투버 '이수안 컴퓨터 연구소'님 강의 참조
01 배열 속성 정보
import numpy as np a1 = np.array([1,2,3,4,5]) a2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) a3 = np.array([ [ [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] ] ]) def array_info(array): print(array) print("ndim:", array.ndim) # 차원수 print("shape:",array.shape) # 엘리멘트 수 print("dtype:",array.dtype) # 데이터 타입 print("size:",array.size) # 배열안의 엘리멘트 총 개수 print("itemsize:",array.itemsize) # 각 엘리먼트의 사이즈 (byte) print("nbytes:",array.nbytes) # size * itemsize = nbytes(전체 사이즈) print("strides:",array.strides) # 각각의 엘리멘트가 다음 엘리멘트로 갈때 필요한 바이트 수 array_info(a1) [1 2 3 4 5] ndim: 1 shape: (5,) dtype: int32 size: 5 itemsize: 4 nbytes: 20 strides: (4,) array_info(a2) [[1 2 3] [4 5 6] [7 8 9]] ndim: 2 shape: (3, 3) dtype: int32 size: 9 itemsize: 4 nbytes: 36 strides: (12, 4) array_info(a3) [[[ 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]]] ndim: 3 shape: (3, 3, 3) dtype: int32 size: 27 itemsize: 4 nbytes: 108 strides: (36, 12, 4)
02 배열 인덱싱 및 슬라이스
print(a1) print(a1[0]) print(a1[-1]) [1 2 3 4 5] 1 5 print(a2) print(a2[0, 0]) print(a2[2, -1]) print(a2[1, 2]) [[1 2 3] 0 [4 5 6] 1 [7 8 9]] 2 1 9 6 print(a3) print(a3[0, 0, 0]) print(a3[2, 1, 1]) [[[ 1 2 3] [ 4 5 6] 0 [ 7 8 9]] [[10 11 12] [13 14 15] 1 [16 17 18]] [[19 20 21] [22 23 24] 2 [25 26 27]]] 1 23
- 2차원/3차원으로 넘어가게되면 차원의 순서도 포함 된다.
- 슬라이싱 : a[start:stop:step]
print(a1) print(a1[0:2]) print(a1[::2]) print(a1[::-1]) [1 2 3 4 5] [1 2] [1 3 5] [5 4 3 2 1] # 2차원 [가로값, 세로값] print(a2) print(a2[1]) print(a2[1, :]) print(a2[:2, :2]) [[1 2 3] [4 5 6] [7 8 9]] [4 5 6] [4 5 6] [[1 2] [4 5]] print(a3) print(a3[1]) print(a3[:1, :1, :1]) [[[ 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]]] [[10 11 12] [13 14 15] [16 17 18]] [[[1]]]
- 불리언 인덱싱
print(a1) b1 = [False, True, True, False, True] print(a1[b1]) b1 = [True, False, True, True, False] print(a1[b1]) [1 2 3 4 5] [2 3 5] [1 3 4] print(a2) b2 = np.random.randint(0, 2, (3,3), dtype = bool) print(b2) print(a2[b2]) [[1 2 3] [4 5 6] [7 8 9]] [[ True False False] [False True True] [ True True False]] [1 5 6 7 8]
- 팬시 인덱싱 - 팬시 인덱싱은 단순 인덱싱과 비슷하지만, 단일 스칼라 대신 인덱스 배열을 전달한다. 이로써 복잡한 배열 값의 하위 집합에 매우 빠르게 접근해 그것을 수정할 수 있다. 한 번에 여러 배열 요소에 접근하기 위해 인덱스의 배열을 전달.
print(a1) print([a1[0], a1[2]]) idx = [0, 2] print(a1[idx]) idx = np.array([[0,1], [2, 0]]) print(a1[idx]) [1 2 3 4 5] [1, 3] [1 3] [[1 2] [3 1]] print(a2) row = np.array([0,2]) #(가로값, 세로값) col = np.array([1,2]) print(a2[row, col]) print(a2[row, :]) print(a2[:, col]) [[1 2 3] [4 5 6] [7 8 9]] [2 9] [[1 2 3] [7 8 9]] [[2 3] [5 6] [8 9]]
03 배열 IUDC
- 삽입
# insert() : 배열의 특정 위치에 값 삽입. axis 없이 지정시 1차원 배열로 변환 # 원본 배열에 변경 없이 새로운 값을 넣어 반환 print(a1) b1 = np.insert(a1, 0, 10) #insert(원본배열, 인덱싱값, 원하는 숫자) print(b1) print(a1) c1 = np.insert(a1, 2, 10) print(c1) [1 2 3 4 5] [10 1 2 3 4 5] [1 2 3 4 5] [ 1 2 10 3 4 5] print(a2) b2 = np.insert(a2, 1, 10, axis=0) print(b2) c2 = np.insert(a2, 3, 10, axis=1) print(c2) [[1 2 3] [4 5 6] [7 8 9]] [[ 1 2 3] [10 10 10] [ 4 5 6] [ 7 8 9]] [[ 1 2 3 10] [ 4 5 6 10] [ 7 8 9 10]]
- 수정
print(a1) a1[0] = 3 a1[3] = 10 print(a1) a1[:1] = 9 print(a1) [1 2 3 4 5] [ 3 2 3 10 5] [ 9 2 3 10 5] i = np.array([1, 3, 4]) a1[i] = 0 print(a1) a1[i] += 4 print(a1) [9 0 3 0 0] [9 4 3 4 4] print(a2) a2[0, 0] = 1 a2[1, 1] = 3 a2[0] = 1 print(a2) row = np.array([0,1]) col = np.array([1,2]) a2[row, col] = 3 print(a2) [[1 1 1] [4 3 6] [7 8 9]] [[1 1 1] [4 3 6] [7 8 9]] [[1 3 1] [4 3 3] [7 8 9]]
- 삭제
# delete() : 배열의 특정 위치에 값 삭제. axis를 지정 하지 않으면 1차원 배열로 반환 # 똑같이 원본 배열 변경없이 새로운 배열 반환. print(a1) b1 = np.delete(a1, 1) print(b1) print(a1) [9 4 3 4 4] [9 3 4 4] [9 4 3 4 4] print(a2) b2 = np.delete(a2, 1, axis=1) print(b2) c2 = np.delete(a2, 1, axis=0) print(c2) [[1 3 1] [4 3 3] [7 8 9]] [[1 1] [4 3] [7 9]] [[1 3 1] [7 8 9]]
- 복사
# 배열 복사 - 리스트 자료형과 달리 배열의 슬라이스는 복사본이 아님. 원본의 값도 바뀜 print(a2) print(a2[:2, :2]) print() a2_sub = a2[:2, :2] print(a2_sub) a2_sub[:, 1] = 1 print(a2_sub) print(a2) [[1 0 1] [4 0 3] [7 8 9]] [[1 0] [4 0]] [[1 0] [4 0]] [[1 1] [4 1]] [[1 1 1] [4 1 3] [7 8 9]]
# copy() : 배열이나 하위 배열 내의 값을 명시적으로 복사 print(a2) a2_sub_copy = a2[:2, :2].copy() print(a2_sub_copy) a2_sub_copy[:, 1] = 1 print(a2_sub_copy) print(a2) [[1 1 1] [4 1 3] [7 8 9]] [[1 1] [4 1]] [[1 1] [4 1]] [[1 1 1] [4 1 3] [7 8 9]]
'빅데이터 > NumPy' 카테고리의 다른 글
NumPy 한번에 끝내기 04 - 데이터 과학 핵심 도구 (연산 함수/정렬/입출력) (0) 2022.01.18 NumPy 한번에 끝내기 03 - 데이터 과학 핵심 도구 (배열 변환/연산) (0) 2022.01.18 NumPy 한번에 끝내기 01 - 데이터 과학 핵심 도구 (배열 생성) (0) 2022.01.17