0. Numpy 시작하기
1. 배열 인덱싱
Python의 리스트가 인덱스화되는 것처럼 NumPy 배열 역시 인덱스로 생각할 수 있습니다.
배열 [1, 2, 3] 이 있다고 합시다.
이 배열의 data와 이에 상응하는 인덱스 번호는 아래와 같습니다.
인덱스 번호 | data |
0 or -3 | 1 |
1 or -2 | 2 |
2 or -1 | 3 |
따라서 다음과 같은 결과를 얻을 수 있습니다.
>>> data = np.array( [1, 2, 3] )
>>> data[0]
1
>>> data[1]
2
>>> data[3]
3
>>> data[0 : 2] # 인덱스 위치 0에서 인덱스 위치 2까지의 배열 섹션을 가져옵니다.
array( [1, 2] )
>>> data[ : 3] # 인덱스 위치 0에서 인덱스 위치 3까지의 배열 섹션을 가져옵니다.
array( [1, 2, 3] )
>>> data[1 : ] # 인덱스 위치 1에서 인덱스 위치 끝까지의 배열 섹션을 가져옵니다.
array( [2, 3] )
>>> data[-2 : ] # 인덱스 위치 -2에서 인덱스 위치 끝(-1)까지의 배열 섹션을 가져옵니다.
array( [2, 3] )
2. 배열 기본 슬라이싱
Python 리스트를 슬라이싱하는 것과 마찬가지로 NumPy 배열 역시 인덱스화되어있으므로 슬라이싱을 할 수 있습니다. 슬라이싱은 리스트의 인덱스 번호를 이용해서 일부분 또는 전체를 추출하는 것을 의미합니다. 슬라이싱을 통해 배열의 섹션 또는 특정 배열의 요소를 사용하여 상세한 분석 또는 추가 작업을 수행할 수 있습니다. 또한 넘파이는 다차원 배열로 사용하는 경우가 많다고 했는데요. 필요에 따라 각 차원별로 어떤 식으로 배열을 할 건지 하는 방법이 필요한데 이때 사용하는 방법이 바로 슬라이싱입니다.(?)
그럼 슬라이싱을 한번 해봅시다.
우선 numpy를 불러오고 배열을 만들어줍니다.
-> 3행 4열, 3x4 2차원 배열이 만들어졌습니다.
여기서 노란 네모 박스 속 배열을 가져오도록 합시다.
이 박스 속 요소들은 1행~2행과 1열~2열인데요. 인덱스는 0부터 시작하므로 부분 배열의 행과 열의 인덱스는 0~1, 0~1이 될 것입니다. 또한 :2, :2 로 표현할 수도 있습니다.
부분 배열은 원래 배열에서 슬라이스 하고자 하는 요소들의 인덱스를 사용해 만듭니다.
배열을 슬라이스 할 위치를 지정하여 그 부분을 가져와서 새로운 배열을 생성합니다.
새로운_array_name = 원본_array_name[ 가져올 행의 인덱스, 가져올 열의 인덱스 ]
위 식으로 새로운 배열이 만들어졌습니다.
같은 방법으로 다른 배열도 만들어 봅시다.
-> 기존의 배열로 또 다른 배열이 만들어진 것을 볼 수 있습니다.
# 주의점
슬라이싱을 만들 때 주의해야 할 점은 슬라이싱 된 배열은 원본 배열과 같은 데이터를 참조하기 때문에 슬라이싱 된 배열을 수정하면 원본 배열 역시 수정된다는 점입니다!!!
-> 슬라이싱 된 배열 arr2의 인덱스 번호 [0, 0]의 요소를 2에서 11로 수정하니, 원본 배열의 같은 장소의 요소 역시 2에서 11로 수정된 것을 볼 수 있습니다. 이는 슬라이싱 된 배열이 원본 배열과 같은 데이터를 참조하기 때문입니다.
# 지금까지는 배열을 2차원 행렬 형태로 슬라이싱 했는데요. 같은 배열을 1차원으로 슬라이싱 할 수도 있습니다.
즉 배열은 여러 차원으로 슬라이싱이 가능합니다.
-> arr2와 arr3가 기존 배열의 인덱스를 가져오는 방법이 어떻게 다른지에 주목해 주세요.
arr3와 같은 배열을 2차원으로 가져올 수도 있습니다.
3. 정수 배열 인덱싱
numpy배열을 슬라이싱 하면, 그 결과는 언제나 원본 배열의 부분 부분들입니다.
즉,
위 네모 친 부분 배열 1,2,3 처럼 원본 배열의 부분 부분들을 새로운 배열로 만듭니다.
그러나 정수 배열 인덱싱 방법을 사용하는 경우에는 원본 배열을 이용하여 원본과 다른 배열을 만들 수 있습니다. 방법은 다음과 같습니다.
새로운_array_name = 원본_array_name[ [가져올 행의 인덱스, ... ], [가져올 열의 인덱스, ... ] ]
아래 예시를 통해 확인해봅시다.
-> 새로운 배열의 요소들은 [ 원본 배열의 1행1열, 원본배열의 2행2열, 원본배열의 3행1열 ] 로 만들어졌습니다.
이를 정수 인덱스로 나타내면 [ [0, 0], [1, 1], [2, 0] ] 이고,
이 인덱스를 행은 행끼리, 열은 열끼리 모으면 행 부분은 [0, 1, 2], 열 부분은 [0, 1, 0]이 됩니다.
따라서
새로운_array_name = 원본_array_name[ 행의 인덱스 모음, 열의 인덱스 모음 ]
로 나타낼 수도 있습니다.
정수 배열 인덱싱으로 만든 배열은 원본과 다른 새로운 배열이므로 배열을 수정해도 원본 배열은 바뀌지 않습니다.
# 정수 배열 인덱싱 활용하기