빅데이터/NumPy
NumPy 한번에 끝내기 02 - 데이터 과학 핵심 도구 (배열 조회/인덱싱/삽입/수정/삭제/복사)
H-V
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]]