Data Science/Machine Learning

2. numpy - ndarray 인덱싱 & 슬라이싱 이해

HJChung 2020. 9. 15. 19:39

2. ndarray 인덱싱 & 슬라이싱 이해하기

1) 인덱싱이란 :

  • 파이썬 리스트와 동일한 개념으로 사용되며
  • , 를 사용하여 각 차원의 인덱스에 접근 가능
  • ndarray에서 원하는 데이터세트를 선택하는데 매우 유용하게 사용된다.  

2) 인덱싱 방법: 

  1. 특정 위치의 단일값 추출
  2. 슬라이싱: 연속된 인덱스상의 ndarray의 값을 추출
  3. 팬시 인덱싱(Fancy Indexing): 연속적이진 않고, 비연속적인 여러 값을 가져올 수 있다. 즉,  일정한 인덱싱 집합을 리스트 또는 ndarray형태로 지정하여 그 위치에 있는 ndarray를 반환
  4. 불린 인덱싱(Boolean indexing): 특정 조건에 해당하는 여부로 True에 해당한는 인덱스 위치에 있는 ndarray를 반환(매우 유용!)

3) 코드 예시

1. 단일 값 추출 예시

1차원 벡터 인덱싱

In [2]:
import numpy as np
In [5]:
x = np.arange(10)
print(x)
 
[0 1 2 3 4 5 6 7 8 9]
In [6]:
x[2]
Out[6]:
2
In [7]:
x[-1] #마이너스가 인덱스로 사용되면 맨 뒤에서부터 위치를 지정한다. 
#즉, x[-1]은 맨 뒤에서 첫번째 값, x[-2]는 맨 뒤에서 두번째 값을 추출 및 반환
Out[7]:
9
 

2차원 행렬 인덱싱

In [9]:
x = np.arange(10).reshape(2, 5)
print(x)
 
[[0 1 2 3 4]
 [5 6 7 8 9]]
In [12]:
x[1, 0] #x[1][0]과 같은 표현으로, ','로 구분
Out[12]:
5
In [14]:
x = np.arange(36).reshape(3, 4, 3)
print(x)
 
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]
  [ 9 10 11]]

 [[12 13 14]
  [15 16 17]
  [18 19 20]
  [21 22 23]]

 [[24 25 26]
  [27 28 29]
  [30 31 32]
  [33 34 35]]]
In [19]:
x[0, 1, 2]
Out[19]:
5
 

2. 슬라이싱 예시

  • 리스트, 문자열 slicing과 동일한 개념으로 사용
  •  범위 지정은 :로 해주고 , 를 사용하여 각 차원 별로 슬라이싱 가능하다. 
  • x[:, 1:4] #[row 범위 , column 범위]

1차원 벡터 슬라이싱

In [20]:
x = np.random.randn(10)
print(x)
 
[ 0.60312113  0.62339851 -0.67793689 -0.13852613 -0.11801581 -0.07814099
  1.44869509  2.61247056  0.0157322   0.96002526]
In [24]:
x[1:3] #실제 원본의 차원이 바뀌지는 않음. 
Out[24]:
array([ 0.62339851, -0.67793689])
In [25]:
x = np.arange(10).reshape(2, 5)
print(x)
 
[[0 1 2 3 4]
 [5 6 7 8 9]]
In [28]:
x[:, 1:4] #[row 범위 , column 범위]
Out[28]:
array([[1, 2, 3],
       [6, 7, 8]])
In [29]:
x[0, :2]
Out[29]:
array([0, 1])
 

3(다)차원 벡터 슬라이싱

In [33]:
x = np.arange(54).reshape(2, 9, 3)
print(x)
 
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]
  [ 9 10 11]
  [12 13 14]
  [15 16 17]
  [18 19 20]
  [21 22 23]
  [24 25 26]]

 [[27 28 29]
  [30 31 32]
  [33 34 35]
  [36 37 38]
  [39 40 41]
  [42 43 44]
  [45 46 47]
  [48 49 50]
  [51 52 53]]]
In [37]:
x[0, 0:2, :]
Out[37]:
array([[0, 1, 2],
       [3, 4, 5]])
In [ ]:

3. Boolean indexing으로 조건에 맞는 데이터 선택하기 예시 ★

Boolean indexing : ndarray인덱싱 시, bool리스트를 전달하여 True인 경우만 필터링 하는 경우에 사용된다.

이러한 방법은 조건 필터링과 검색을 동시에 할 수 있기 대문에 매우 자주 사용되는 인덱싱 방법이다

In [1]:
import numpy as np
In [2]:
x = np.random.randint(1, 100, size = 10)
print(x)
 
[67 56  2 31 47 85 29 11 75 17]

1) 이제 x를 활용하여 짝수만 있는 boolean array로 만들어보자.

In [7]:
even_mask = x%2 == 0 #이것의 결과가 boolean list이다. 
print(even_mask)
 
[False  True  True False False False False False False False]
In [6]:
x[even_mask] #True인 것의 값만 추출됨. x[x%2==0] 로 한 번에 써 줄 수도 있다. 
Out[6]:
array([56,  2])

2) 이제 30보다 큰 수만 추출

In [8]:
x[x>30]
Out[8]:
array([67, 56, 31, 47, 85, 75])

3) 다중조건 사용하기

- 파이썬 논리 연산자인 and, or, not 키워드 사용 불가
- 대신 &(AND), |(OR) 사용
- not같은 경우는 기호를 쓰는 것보다, 조건을 반대로 주면 된다. 
In [10]:
x[(x%2==0) & (x<30)]
Out[10]:
array([2])
In [11]:
x[(x<30) | (x>50)]
Out[11]:
array([67, 56,  2, 85, 29, 11, 75, 17])