1차원 ndarray

Numpy의 기본 자료형 ndarray의 기본적인 인덱싱과 슬라이싱은 List 객체와 동일하다.

x1 = np.array([ 1,  3,  5,  7,  9])
x1[0] # 1
x1[3] # 7
x1[-1] # 9
x1[-2] # 7
x1[1:3] # [3, 5]

 

2차원 ndarray

2차원 리스트 배열에서의 indexing은 x[i][j] 형태로 가능한 것처럼, 2차원 ndarray 배열에서의 indexing은 x[i, j] 형태로 가능하다. 이때 i는 행, j는 열을 의미한다. 먼저 np.random.random로 (10, 5) 크기의 ndarray를 생성한다.

x2 = np.random.random(size = (10, 5))
x2

기본적으로 ndarray 객체를 인덱싱을 할 경우, 인덱싱 한 만큼 차원의 개수가 줄어든다. 반면 슬라이싱의 경우, 차원의 개수가 줄어들지 않는다. 1차원 ndarray의 경우 indexing을 하면 해당 index의 값이 나온다. 당연히 크기은 ()이 된다. slicing을 하면 1차원 ndarray의 형태로 값이 반환된다. slicing을 했을 때, 2개의 요소가 들어있는 ndarray가 반환된다면 크기는 (2, )이다. 2차원 ndarray도 마찬가지로 적용된다. 다음과 같이 4가지 경우로 나누어 생각해볼 수 있다.

# 행과 열 모두 indexing을 할 경우, 차원이 두 개 줄어들어 0차원의 값이 된다. 
# 행은 index가 0, 열은 index가 1인 값을 가져온다. 크기는 () 이다.
x2[0, 1] # 0.8109362424803798

# slicing과 indexing이 섞여있을 경우, 차원이 하나 줄어들어 1차원 ndarray가 된다.
# 행은 1~4까지 slicing, 열은 index가 2인 값을 가져온다. 크기는 (3, )이다.
x2[1:4, 2]
# [0.29726177 0.48429699 0.01695983]

# 행은 index가 0, 열은 2~4까지 slicing한 값을 가져온다. 크기는 (2, )이다.
x2[0, 2:4]
# [0.24154943 0.72852281]

# 행과 열 모두 slicing 할 경우, 차원이 그대로 유지된다.
# 행은 1~4까지, 열은 2~3까지 slicing한 값을 가져온다. 크기는 (3, 1)이다.
x2[1:4, 2:3]
# [[0.29726177]
#  [0.48429699]
#  [0.01695983]]

# 행은 0~3까지, 열은 2~4까지 slicing한 값을 가져온다. 크기는 (3, 2)이다.
x2[0:3, 2:4]
# [[0.24154943 0.72852281]
#  [0.29726177 0.53198251]
#  [0.48429699 0.24625166]]

 

기타 Indexing & Slicing 방법

  • Indexing하는 ndarray와 크기가 동일한 bool list, ndarray를 index로 활용할 수 있다. 이때, 비교 연산자를 활용할 수 있다.
  • 여러 개의 index를 가진 리스트 형태를 입력받을 수 있다. index를 입력받은 순서대로 ndarray에서 요소를 가져오며, 이때 차원은 동일하게 유지된다.
# 부울 리스트도 index로 활용할 수 있으며, True에 대응되는 값만 가져올 수 있다. (비교 연산자 활용)
x1 = np.array([1, 3, 5, 7, 9])
B = np.array([True, False, False, True, False])
x1[B] # array([1, 7])

# 여러 개의 index를 가진 리스트 형태를 입력받을 수도 있음 (차원 유지)
x1[[1, 3, 4]] # array([3, 7, 9])
x2[[1, 3, 9, 4]]
# array([[0.62815332, 0.80405327, 0.29726177, 0.53198251, 0.58528001],
#        [0.97952609, 0.38026392, 0.01695983, 0.5452472 , 0.6158523 ],
#        [0.38186856, 0.11595086, 0.56334012, 0.2500553 , 0.21869989],
#        [0.63436087, 0.82194805, 0.72035181, 0.08148306, 0.01413871]])
728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기