[3] 매트릭스 인덱싱(Indexing)/슬라이싱(Slicing) - numpy 넘파이 array 활용 (Danuri coding/다누리 코딩)
매트릭스(Matrix)를 생성하고 원하는 형태로 만드는 것까지 알아보았다면,
+ 이전 매트릭스 관련 내용은 다음을 참고해주세요 :)
이번에는 원하는 데이터만 찾고, 추출하는 작업을 해보겠습니다.
이 작업이 바로 인덱싱(Indexing)과 슬라이싱(Slicing)입니다.
인덱싱과 슬라이싱 작업은 데이터를 전처리하고 원하는 값들을 불러오는 작업에 많이 쓰이게 됩니다.
이를 활용하여 자신이 원하는 데이터를 가져올 수 있도록 해봅시다.
1. 인덱싱 (Indexing)
matrix = np.array([[1, 2, 3], [4, 5, 6]], int) #매트릭스를 먼저 만들어 줍니다.
print(matrix)
"""
[[1 2 3]
[4 5 6]]
"""
#1. 인덱싱 - 해당 위치에 있는 값을 가져오기
print(matrix[1,1]) #이게 만약 [0,0] 이면 1이 나오게 됩니다 :)
### 5
print(matrix[1][1])
### 5
매트릭스의 인덱싱은 이차원 배열이기 때문에 [0,0] 형식으로 표기할 수 있습니다.
따라서 np.array()로 지정한 매트릭스에서 - [0,0] 혹은 [0][0] 방식으로 표기하게 되면 해당 위치에 있는 값을 볼 수 있습니다.
이를 좀 더 활용한다면,
해당 위치에 있는 값을 바꿀 수도 있습니다.
#1.1. 인덱싱 활용 - 해당 위치에 있는 값을 바꿀 수 있습니다.
matrix[1][1] = 1
matrix
"""
array([[1, 2, 3],
[4, 1, 6]])
"""
다음과 같이 [1,1] 자리에 있는 값을 1로 바꾸었습니다.
기존 5였던 값이 -> 1로 변한 것을 확인할 수 있습니다.
2. 슬라이싱 (Slicing)
슬라이싱은 특정 행, 열에 있는 값을 가져오는 것을 말합니다.
코드로 살펴보게 되면,
#1. 행과 열을 입력하여 slicing 을 합니다.
matrix = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)
matrix[:, 2:] #전체 row의 2열 이상부터 가져온다. 여기서는 첫번째가 row, 두번째가 column 이라고 보면 된다.
"""
array([[ 3, 4, 5],
[ 8, 9, 10]])
"""
다음과 같이 [row, column] 자리에 범위를 지정해주면 해당 범위에 있는 값들을 가져오게 됩니다.
위에 예시를 보면, 앞에 row는 전체를 가져오고, column 은 2번째 이상부터 가져오는 것을 볼 수 있습니다.
이를 좀 더 활용해본다면,
row 나 column 만 지정해준 경우를 생각해볼 수 있습니다.
#1.1. row 나 column 만 지정하여 슬라이싱
matrix[0:1] #이렇게 row만 지정해줄 경우, 0번째 row의 전체를 가져온다.
### array([[1, 2, 3, 4, 5]])
그리고 매트릭스 크기가 크거나, 특정 단위로 슬라이싱을 해야 하는 경우가 있을 수 있습니다.
이때는,
#1.2. start, end, step 으로 슬라이싱
matrix[:,::2] # 이렇게 하면 row는 다 가져오고, column 부분에서 start, end, step 으로 설정되어 2칸 간격으로 가져온다.
"""
array([[ 1, 3, 5],
[ 6, 8, 10]])
"""
이렇게 start, end, step을 설정하여 원하는 값을 가져올 수 있습니다.
여기서 살펴보아야 할 점은, 앞에서 슬라이싱 하는 방법에서 활용한 형태라는 것입니다.
따라서,
앞에 row는 전체를 가져오고, 뒤에는 column이라고 볼 수 있습니다.
: : : 이런 식으로 표현이 되어 있는데, 순서대로 start, end, step입니다.
1:3:1이라고 설정할 경우 1부터 시작해서 2(3-1)까지 1칸 간격으로 슬라이싱을 해달라는 표현입니다.
matrix[:,1:3:1]
"""
array([[2, 3],
[7, 8]])
"""
따라서 다음과 같은 값을 얻을 수 있습니다.
인덱싱(Indexing)과 슬라이싱(Slicing) 부분은 활용도가 높으니 꼭 알아가셨으면 좋겠습니다 :)
