cs 5. Numpy응용하기 (numpy인덱싱, 슬라이싱, 정수배열인덱싱, 부분배열, 배열 슬라이싱 하는 법, 배열 인덱스) :: 맥스웰과 데자와

0. Numpy 시작하기

 

gksid102.tistory.com/27

 

4. Numpy시작하기 (numpy란? numpy설치, 배열이란? , ndarray, 다차원배열객체, 배열만들기, 배열관련함수

1.NumPy란? NumPy는 Python이 수학적 연산을 보다 효과적으로 할 수 있게 만드는 기본 패키지입니다. 파이썬의 라이브러리로서 다차원 배열 객체(ndarray), 행렬, 벡터, 형상 조작, 이산 푸리에 변환, 기

gksid102.tistory.com

 

 

 

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차원으로 가져올 수도 있습니다.

 

예시 1

 

예시 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[ 행의 인덱스 모음, 열의 인덱스 모음 ]

 

로 나타낼 수도 있습니다.

 

정수 배열 인덱싱으로 만든 배열은 원본과 다른 새로운 배열이므로 배열을 수정해도 원본 배열은 바뀌지 않습니다.

 

 

# 정수 배열 인덱싱 활용하기

 

예시 1

 

예시 2

 

예시 3

 

+ Recent posts