빅데이터/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]]