어제에 이어 NumPy의 기본 사용법과 인덱싱, 슬라이싱에 대해 배웠다. 인덱싱과 슬라이싱은 기본적으로 리스트의 인덱싱, 슬라이싱과 비슷했지만 다차원 배열에 유용한 추가 기능이 많이 있었다.
a = np.array([1,2,3,4,5])
print(a[1]) # 2
print(a[-1]) # 5
# 파이썬 리스트
matrix = [[1,2,3], [4,5,6]]
print("파이썬 인덱싱 :", matrix[1][1])
# 파이썬 인덱싱 : 5
# NumPy 배열
a2 = np.array([[1,2,3], [4,5,6]])
print("넘파이 인덱싱 :", a2[1, 1])
# 넘파이 인덱싱 : 5
a3 = np.arange(24).reshape(2,3,4)
print(a3)
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
print("17 확인", a3[1,1,1])
print("11 확인", a3[0,2,3])
# 17 확인 17
# 11 확인 11
뷰(View)
원본 데이터의 메모리를 공유하기에 슬라이스 결과를 수정하면 원본 배열도 변경
a1 = np.array([1,2,3,4,5])
print(a1[1:3]) # [2 3]
print(a1[2:]) # [3 4 5]
print(a1[:2]) # [1 2]
print(a1[::2]) # [1 3 5]
print(a1[::-1]) # [5 4 3 2 1]
arr[행 슬라이스, 열 슬라이스]a2 = np.arange(1, 21).reshape(4,5)
print(a2)
# [[ 1 2 3 4 5]
# [ 6 7 8 9 10]
# [11 12 13 14 15]
# [16 17 18 19 20]]
# 행 슬라이싱 = 2차원 슬라이싱
print(a2[0, :])
# [1 2 3 4 5]
print(a2[1])
# [ 6 7 8 9 10]
print(a2[1:3])
# [[ 6 7 8 9 10]
# [11 12 13 14 15]]
print(a2[2:])
# [[11 12 13 14 15]
# [16 17 18 19 20]]
# 열 슬라이싱 = 1차원 슬라이싱
print(a2[:, 2])
# [ 3 8 13 18]
print(a2[:, -1])
# [ 5 10 15 20]
print(a2[:, 1:3])
# [[ 2 3]
# [ 7 8]
# [12 13]
# [17 18]]
# 행과 열 슬라이싱
print(a2[1:3, 2:4])
# [[ 8 9]
# [13 14]]
print(a2[2:, 3:])
# [[14 15]
# [19 20]]
print(a2[::2, ::2])
# [[ 1 3 5]
# [11 13 15]]
arr[3차원 슬라이스, 2차원 슬라이스, 1차원 슬라이스]a3 = np.arange(36).reshape(3,3,4)
print(a3)
# [[[ 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]]]
print(a3[1, 1, 1:3])
# [17 18]
a1 = np.array([1,2,3])
a1_copied = a1.view()
a1_copied[1] = 10
print("원본", a1) # 원본 [ 1 10 3]
print("복사본", a1_copied) # 복사본 [ 1 10 3]
a2 = np.array([1,2,3])
a2_copied = a2.copy()
a2_copied[1] = 10
print("원본", a2) # 원본 [ 1 2 3]
print("복사본", a2_copied) # 복사본 [ 1 10 3]
af = np.arange(1,21)
print(af)
# [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
print(af[[4,7,11]])
# [ 5 8 12]
af2 = np.arange(1, 21).reshape(4,5)
print(af2)
# [[ 1 2 3 4 5]
# [ 6 7 8 9 10]
# [11 12 13 14 15]
# [16 17 18 19 20]]
print(af2[[1,3],[2,4]])
# [ 8 20]
arr = np.arange(1, 26).reshape(5, 5)
print(arr, "\n")
# [[ 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]]
new_arr = arr[[1,3]]
print(new_arr[:, [4,0,2]])
# [[10 6 8]
# [20 16 18]]
ab = np.linspace(10,100,10)
print(ab)
# [ 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
print(ab[ab > 40])
# [ 50. 60. 70. 80. 90. 100.]
ab2 = np.arange(0,21)
print(ab2)
# [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
mask = ab2 % 2 == 0
print(mask)
# [ True False True False True False True False True False True False
# True False True False True False True False True]
print(ab2[mask])
# [ 0 2 4 6 8 10 12 14 16 18 20]
오늘은 주로 배열을 생성한 후 생성된 배열로 여러 인덱싱과 슬라이싱을 하는 연습을 많이 했다. NumPy의 기본기는 앞으로를 생각하면 지금 충분히 많은 문제들을 풀어보며 익숙해지는 것이 좋을 것 같아서 주말 동안 많은 NumPy 관련 문제들을 풀어봐야겠다.