프로그래밍/Python

Python 배열 슬라이싱 공략 (Numpy)

Lou Park 2021. 3. 7. 22:52

요즘은 VR 세계에서 인기있을 Fruit Ninja

python의 놀라운 점 중 하나는 배열을 간단한 문법으로 완전히 마음대로 가지고 놀 수 있다는 거다. 다른 언어들이 내가 과일을 깎는 정도의  효율성이라면...(매우 서툴러서 거의 네모가됨) python의 배열 슬라이스 능력은 마치 라떼 유행했던 Fruit Ninja라는 게임을 연상케한다!

 

그리고 numpy 같은 라이브러리를 활용하면 더욱 다양한 작업을 할 수 있다. NLP를 아주 겉만 살짝 맛보면서 matrix[:, 2] 막 이렇게 생긴걸 봤는데 배열 자르기를 내가 정말 모르는구나...생각이들어서 이렇게 정리를 해보려한다.

 

배열 선언하기

1차원 배열을 선언하는 방법은 다음과 같다.

# python
array = [0] * 8 # [0, 0, 0, 0, 0, 0, 0, 0]
array = [2 * i for i in range(5)] # [0, 2, 4, 6, 8]

# using numpy
array = np.zeros(8) # [0. 0. 0. 0. 0. 0. 0. 0.]
array = np.ones(8) # [1. 1. 1. 1. 1. 1. 1. 1.]

 

 

함수 살펴보기

np.zeros(length)
주어진 length 만큼 0으로 채운 배열을 반환한다.

np.ones(length)
주어진 length 만큼 1로 채운 배열을 반환한다.

 

 

2차원 배열 (Matrix) 선언하기

2차원 배열을 만드는 방법은 다음과 같다.

# python
matrix = [[0] * 2, [0] * 2]
# result: [[0, 0], [0, 0]]

# using numpy
matrix = np.zeros((2, 2))
# result:
# [[0. 0.]
#  [0. 0.]]
matrix = np.full((2, 3), 1)
# result:
# [[1 1 1]
#  [1 1 1]]
matrix = np.eye(3)
# result:
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 1.]]
matrix = np.array(range(10)).reshape((5, 2))
# result:
# [[0 1]
#  [2 3]
#  [4 5]
#  [6 7]
#  [8 9]]
print(matrix)

 

 

함수 살펴보기

np.zeros((m, n))
m x n 사이즈의 0으로 채운 행렬을 반환한다.

np.full((m, n), k)
m x n 사이즈의 k로 채운 행렬을 반환한다.

np.eye(n)
n x n 사이즈의 대각행렬을 반환한다.

np.array(range(k)).reshape((m, n))
np.array(range(k))는 0~k-1로 채워진 k길이의 1차원 배열을 반환하는데, reshape를 사용하여 다차원 배열로 변형 해 주었다.
여기서는 m x n 행렬로 바꿔주었다.

 

 

배열 자르기

array = np.array(range(5))
a = array[2:4] # [2, 3]
b = array[2:] # [2, 3, 4]
c = array[:2] # [0, 1]
d = array[:] # [0, 1, 2, 3, 4, 5]

파이썬에서는 콜론:을 이용해 배열 슬라이싱을 지원하는데, 위 코드조각에서 알 수 있듯이 콜론 앞의 범위를 포함하고, 콜론 뒤의 범위를 포함하지 않는다. [n:m)

 

그러면 내가 정말 이상하다고 생각했던...matrix[:, 2]이건 뭐라고 생각할 수 있을까?

이건 슬라이싱과 인덱싱이 합쳐졌다.


matrix[m, n]에서 n이 그냥 콜론으로 바뀐것! 그러면 이것이 3번째 줄 세로로 전체를 가져오는 것이라는걸 알 수 있다.

드디어 이해가 좀 되는 것 같다!

 

m = np.array(range(9)).reshape((3, 3))
print(m)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]
print(m[:, 2])
# [2 5 8]
print(m[:][2])
# [6 7 8]
print(m[1:, 1:])
# [[4 5]
#  [7 8]]
print(m[:2, :2])
# [[0 1]
#  [3 4]]

print(np.shape(m)) # (3, 3)
print(np.shape(m[:, 0])) # (3,)
print(np.shape(m[:][0])) # (3,)

 

 

함수 살펴보기

np.shape(m)
m에 해당하는 배열의 모양을 알려준다.