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

인덱싱을 하나 섞을 때마다 차원이 하나 준다.