NumPy 배열 활용
1. 인덱싱과 슬라이싱
1.1 기본 인덱싱과 슬라이싱
인덱싱(indexing)은 파이썬의 인덱싱과 유사합니다. arr[index]와 같은 형태입니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
arr[2]
다만, 완전히 동일한 방식은 아닙니다. 다차원 배열의 경우, 각 차원에 대한 인덱스를 콤마로 구분하여 지정할 수 있습니다. arr[row, column]과 같은 형태로 사용합니다.
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr[1, 2]
1.2 슬라이싱
슬라이싱(slicing)도 파이썬과 유사하게 arr[start:end:step] 형태로 사용합니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr[1:4]) # 기본 슬라이싱
print(arr[:3]) # 처음부터 3번째 요소까지
print(arr[2:]) # 3번째 요소부터 끝까지
print(arr[::2]) # 2칸씩 건너뛰며 선택
다차원 배열의 경우, 각 차원에 대해 슬라이싱을 지정할 수 있습니다. arr[row_start:row_end, column_start:column_end] 형태로 사용합니다.
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr[0:2, 1:3]
1.3 불리언 인덱싱
불리언 인덱싱(boolean indexing)은 조건에 맞는 요소만 선택하는 방법입니다. arr[condition] 형태로 사용합니다. 여기서 condition은 True/False 값을 가지는 배열이며, arr와 condition의 크기는 동일해야 합니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
arr[arr > 2]
직접 불리언 값을 사용할 수도 있습니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
mask = np.array([False, True, True, False, True])
arr[mask]
이번에는 복합 조건을 사용해보겠습니다. 조건은 and로 둘 다 만족하는 경우를 사용해보겠습니다. 다만 불리언 인덱싱에서 and 연산자를 사용하지 않고 & 연산자를 사용해야 합니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
mask = (arr > 2) & (arr < 5)
arr[mask] # 복합 조건
1.4 팬시 인덱싱
팬시 인덱싱(fancy indexing)은 정수 배열을 사용하여 여러 인덱스의 요소를 동시에 선택하는 방법입니다. arr[[index1, index2, ...]] 형태로 사용합니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
arr[[1, 3, 4]]
2. 배열 연결
2.1 concatenate 함수

배열 연결은 두 개 이상의 배열을 하나로 합치는 과정입니다. np.concatenate() 함수는 튜플이나 배열의 리스트를 받아 지정된 축을 따라 배열들을 연결합니다. concatenate는 배열들을 끝과 끝을 이어 붙이는 것과 같습니다.
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.concatenate((a, b))
2.2 vstack 함수

np.vstack() 함수는 수직(vertical)으로 배열들을 쌓아 연결합니다. 이는 2D 배열에서 행을 추가하는 것과 같습니다. vstack은 배열들을 수직으로 쌓는 것과 같습니다.
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.vstack((a, b))
2.3 hstack 함수

np.hstack() 함수는 수평(horizontal)으로 배열들을 옆으로 연결합니다. 이는 2D 배열에서 열을 추가하는 것과 같습니다. hstack은 배열들을 수평으로 연결하는 것과 같습니다.
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.hstack((a, b))
3. 배열 분할
3.1 split 함수

np.split() 함수는 배열을 여러 개의 하위 배열로 균등하게 나눕니다. 분할 지점이나 분할할 배열의 수를 지정할 수 있습니다. np.split(arr, 3)은 3개의 하위 배열로 나누는 것을 의미합니다. 주의해야 할 점은 균등하게 나눌 수 없는 경우 ValueError가 발생합니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
np.split(arr, 3)
3.2 array_split 함수

np.array_split() 함수는 split 함수와 유사하지만, 균등하게 나눌 수 없는 경우에도 사용할 수 있습니다. 이 경우 일부 하위 배열은 다른 배열보다 하나 더 적은 요소를 가질 수 있습니다.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
np.array_split(arr, 4)
3.3 hsplit 함수

np.hsplit() 함수는 배열을 수평(horizontal)으로 분할합니다.
import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
np.hsplit(arr, 2)
3.4 vsplit 함수

np.vsplit() 함수는 배열을 수직(vertical)으로 분할합니다.
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
np.vsplit(arr, 2)