ndarray 인덱싱,슬라이싱
- Python/Numpy
- 2020. 5. 17.
주어진 ndarray 인덱스는 어떻게 이루어져 있고 슬라이싱은 어떻게 하는지 소개하겠습니다.
결론적으로 말하면 파이썬의 리스트를 다루었던 방법과 동일합니다. 다른 점이 있다면 리스트에서는 1차원의 경우만 다뤘지만 ndarray는 2차원이상도 인덱싱, 슬라이싱을 다루어야 하는게 다릅니다. 하지만 파이썬의 리스트에서 다루었던 인덱싱, 슬라이싱과 다름없이 다룰 수 있습니다.
import numpy as np
항상 numpy를 쓰려면 import를 먼저 해야겠죠.
1차원 인덱싱, 슬라이싱
x = np.arange(10)
print(x)
간단하게 0부터 9까지의 나열을 보겠습니다. 여기서 3을 가져오고 싶습니다. 그럼 3의 인덱스를 알아야합니다. 3의 인덱스는 무엇일까요? 파이썬의 리스트에서처럼 3이 됩니다.
다음과 같이 입력해 인덱싱을 합니다.
x[3]
슬라이싱은 범위만 적어주면 됩니다. 리스트와 동일하게 범위의 끝점은 포함되지 않습니다.
x[1:3]
두개씩 띄어서 가져오고 싶다면 뒤에 2를 더 써넣으면 됩니다.
x[1:7:2]
따라서 1차원인 경우는 리스트와 동일한 방법으로 인덱싱과 슬라이싱을 할 수 있습니다.
2차원 인덱싱, 슬라이싱
2차원과 1차원의 차이는 간단합니다. 차원이 하나 더 늘었다는 것입니다. 차원이 하나 더 늘었으니 한번더 인덱싱을 하게 됩니다. 방법은 두가지입니다. 컴마를 이용할 수 있고 대괄호를 한번 더 쓸 수도 있습니다.
x = np.arange(10).reshape(2, 5)
print(x)
2차원 행렬을 생성했습니다.
간단하게 1차원에서 했던 방식대로 해보겠습니다.
x[0]
보시는 바와 같이 row를 기준으로 0번째 자리의 1차원 벡터를 가져오는 것을 볼 수 있습니다. 여기서 한번 더 할 수 있습니다. x[0]에서 1번째 숫자를 가져오겠습니다.
x[0][1]
예상하셨듯이 1이 나옵니다. 이렇듯 인덱싱을 하면 한차원씩 줄여서 뽑아옵니다. 2차원이니 1차원 벡터를 뽑고 그 다음엔 0차원인 숫자를 뽑게 됩니다.
같은 의미의 얘기를 컴마를 찍어서 할 수 있습니다.
x[0][1]을 표현해보겠습니다.
x[0,1]
위와 같이 컴마를 이용해서도 쓸 수 있습니다.
슬라이싱은 감각있으신 분은 어느정도 감을 잡으셨겠지만 범위만 잘 정해주면 됩니다.
첫번째 열의 1,2와 두번째 열의 5,6을 뽑아보겠습니다.
x[:,0:2]
0,1만 가져오고 싶다면 0번째 row에서 가져오면 되겠습니다.
x[0,0:2]
슬라이싱은 일자로 잘라서 가져오는 것이라 0,1과 5,6,7을 동시에 뽑을 수 없습니다.
하려면 따로 인덱싱을 하시고 브로드캐스팅이나 다른 방법으로 합치는 방법으로 할 수는 있습니다.
이번엔 차원을 줄이지 않고 0,1을 가져와 보겠습니다.
x[0,0:2]을 보면 1차원 벡터로 이루어진 것을 볼 수 있습니다. 인덱싱을 하면 차원이 하나씩 줄어서 나오기 때문에 당연히 1차원으로 나옵니다. 종종 차원을 줄이지 말아야 하는 상황이 오는데 슬라이싱을 이용해 차원을 줄이지 않고 뽑을 수 있습니다.
x[:1,:2]
대괄호가 두개로 나오는 2차원 벡터가 된 것을 볼 수 있습니다.
1까지 슬라이싱을 하고 그 다음에 2까지 슬라이싱을 한다는 얘기이므로 엄연히 인덱싱과는 다른 의미가 됩니다.
3차원 이상의 ndarray도 동일한 방법으로 인덱싱과 슬라이싱을 할 수 있습니다. 그래서 3차원 이상의 내용은 생략하고 이상으로 포스팅을 마치겠습니다.
'Python > Numpy' 카테고리의 다른 글
[Numpy] 연산,통계,집계함수 (2) | 2020.05.21 |
---|---|
[파이썬] Numpy 모양 바꾸기(reshape) (0) | 2020.05.19 |
ndarray 랜덤한값 생성 (0) | 2020.05.14 |
ndarray 생성하기 (0) | 2020.05.13 |
Numpy 란? (7) | 2020.05.11 |