python/numpy
3. ndarray - 인덱싱_슬라이싱
Abokadoh
2023. 2. 15. 20:21
import numpy as np
ndarray 인덱싱은 파이썬 리스트와 동일한 개념이다 ,를 사용해서 각 차원의 인덱스에 접근할 수 있다.
1차원 ndarray의 인덱싱을 해보자.
1. 1차원 벡터 인덱싱
# <in>
x = np.arange(10)
print(x)
print(x[2])
x[2] = 3
print(x)
# <out>
[0 1 2 3 4 5 6 7 8 9]
2
[0 1 3 3 4 5 6 7 8 9]
1차원 벡터의 인덱싱은 파이썬 리스트와 거의 똑같다고 보면 될 것 같다.
2. 2차원 행렬 인덱싱
# <in>
x = np.arange(10).reshape(2, 5) # 1차원 벡터를 reshape()함수로 2차원 행렬로 만들어줬다.
print(x)
print(x[0])
print(x[1])
print(x[0,2])
# <out>
[[0 1 2 3 4] # dim = 2
[5 6 7 8 9]]
[0 1 2 3 4] # dim = 1
[5 6 7 8 9] # dim = 1
2 # scalar
첫 번째 결과에서는 2 x 5 의 2차원 행렬을 볼 수 있다.
2차원 행렬을 한 번 인덱싱하면 그 결과가 1차원 벡터로 차원이 한 단계 내려간 것을 확인할 수 있다.
또한 ,를 사용해 두 번의 인덱싱을 거치면 벡터에서 스칼라로 한 단계 더 내려간 것을 확인할 수 있다.
3. 3차원 텐서 인덱싱
# <in>
x = np.arange(36).reshape(3, 4, 3)
x[0]
x[1,2]
x[0,0,0]
# <out>
[[ 0 1 2] # dim = 2
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[18 19 20] # dim = 1
0 # scalar
4. 1차원 ndarray 슬라이싱
- 리스트, 문자열 slicing과 동일한 개념으로 사용이 가능하다.
- ,를 사용하여 각 차원 별로 슬라이싱이 가능하다.
# <in>
x = np.arange(10)
x
x[1:]
# <out>
[0 1 2 3 4 5 6 7 8 9] # dim = 1
[1 2 3 4 5 6 7 8 9] # dim = 1
1차원 벡터의 1부터 끝까지 슬라이싱 한 결과로, 인덱스를 할 때처럼 차원이 줄지 않는다.
5. 2차원 행렬 슬라이싱
# <in>
x = np.arange(10).reshape(2, 5)
x
x[:,3:]
# <out>
[[0 1 2 3 4] # dim = 2
[5 6 7 8 9]]
array([[3, 4], # dim = 2
[8, 9]])
2차원 역시 슬라이싱을 한다고 차원이 줄거나 하지 않는다.
6. ndarray 인덱싱 + 슬라이싱
# <in>
x = np.arange(27).reshape(3, 3, 3)
x
x[0,:,:]
x[0,0,:]
x[0,0,0]
# <out>
[[[ 0 1 2] # dim = 3
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
[[0 1 2] # dim = 2
[3 4 5]
[6 7 8]]
[0 1 2] # dim = 1
0 # scalar
인덱싱을 하나 섞을 때마다 차원이 하나 준다.