SiLaure's Data

[Numpy] 04. Array Indexing 본문

Records of/Learning

[Numpy] 04. Array Indexing

data_soin 2021. 7. 28. 11:05

 

- Indexing (same as python list, but more powerful)

  • 기본적으로는 list indexing과 동일하다.
  • 그러나 list indexing에서는 제공되지 않는 (리스트 안에 수식 --연산기능)가 제공된다.
  • 콜론(:) 이 slicing 기능을 한다.

 

  • array 생성
arr1 = np.arange(10)
arr1

출력 : array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

 

 

  • 첫 번째 원소
arr1[0]

출력 : 0

 

 

  • 마지막 원소
arr1[-1]

출력 : 9

 

 

  • 앞에서부터 원소 3개 slicing
arr1[:3]

출력 : array([0, 1, 2])

 

 

  • 2차원 numpy array
arr2 = np.array([[1, 2, 3, 4],
               [5, 6, 7, 8],
               [9, 10, 11, 12]])
               
arr2

출력 : 

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

 

 

  • arr2의 2, 3 원소 = 7
arr2[1][2] # 는 
arr2[1,2]  # 와 같다.

 

 

  • arr2의 세번째 columnm (3, 7, 11)
for row in arr2 :
   print(row[2])

 

 

  • arr2에 있는 모든 row에 대해서 3번째 원소를 indexing하면 결과가 numpy array로 나온다.
arr2[0, 2]
arr2[1, 2]
arr2[2, 2]

== arr2[:, 2]

출력 : array([3, 7, 11])

 

 

  • arr2에 있는 두 번째 row에 대해서 모든 원소를 indexing하면 numpy array가 나온다.
arr2[1, :]
arr2[1]

출력 : array([5, 6, 7, 8])

 

- Masking -- 필터링

: 0과 1의 연산을 통해서 일부를 걸러낸다.

 

  • 1과 0만을 원소로 가지는 numpy array를 생성(7개)
mask = np.array([1, 0, 0, 1, 1, 0, 0])
mask

출력 : array([1, 0, 0, 1, 1, 0, 0])

 

  • 표준정규분포에서 random sampling을 한 원소를 가지는 7x4 행렬을 생성
data = np.random.randn(7, 4)
data

출력 : 

array([[-0.26404645, -0.3611359 ,  1.96175987, -0.0874347 ], 
       [-0.56872521, -1.13453742, -0.71474021, -0.7333052 ], 
       [ 0.19843513,  1.34483804,  0.2476241 ,  1.7642281 ], 
       [ 1.2540093 ,  2.45855174,  0.54001339,  0.92570961], 
       [-0.42096425,  0.53155381, -0.33486082, -0.85578712], 
       [ 0.81337903, -0.09469677,  0.13216655, -0.46730098], 
       [ 0.21305362, -0.76414546, -1.07716666,  0.30146443]])

 

 

  • mask 만들기
masked_data = (mask == 1)  # mask에서 1인 원소만 True로 출력, 나머지는 False
masked_data
mask에서 1인 원소만 True로 출력, 나머지는 False
결과는 boolean array(boolean mask)

출력 : array([ True, False, False, True, True, False, False])

 

  • 위에서 생성한 data에 mask를 적용
data[masked_data, :]
data[masked_data]와 data[mask==1] 과 같다.
masked_data 를 대입했을 때 1인 row의 원소를 모두 가져온다
    -- data[row, column]

출력 : 

array([[ 0.        , -0.3611359 ,  1.96175987, -0.0874347 ],
       [ 1.2540093 ,  2.45855174,  0.54001339,  0.92570961],
       [ 0.        ,  0.53155381, -0.33486082, -0.85578712]])

 

 

  • fancy indexing을 이용해서 masking
Q. data에 2번째 column에 있는 원소가 0보다 큰 위치의 모든 row를 출력하라. 
data[: , 1] > 0

출력 : array([ True, True, True, True, False, False, False])

Q2. data에 2번째 column에 있는 원소 중에 0보다 큰 원소들을 출력하라.
data[data[:, 1]>0][:, 1]
#	== data[data[:, 1]>0, 1]

출력 : array([2.51125627, 0.44818361, 0.12387979, 1.64779761])

 

  • 마스크를 0으로 바꿔본다.
data[mask==0, :]

 

 

  • fancy indexing을 이용해서 masking
 data[:, 0]<0
7x1의 mask == 1열의 원소 중에 0보다 작은 원소들의 위치가 True.

 

 

  • fancy indexing의 또 다른 방법
data[data[:, 0]<0, 0]
== data[maked된 데이터 , 0]
    --> indexing된 making을 이용해서 indexing

출력 : array([-0.26404645, -0.56872521, -0.42096425])

 

  • 2차원 data에서 첫번째 column에 0보다 작은 원소들을 0으로 치환
data[data[:,0]<0, 0] = 0
data의 indexing의 making을 assignment

출력 : 

array([[ 0.        ,  2.51125627, -1.72344121, -1.10685344],
       [ 0.31220981,  0.44818361,  0.28256441,  0.81012228],
       [ 0.57871109,  0.12387979,  1.18237909, -2.0297186 ],
       [ 1.36959035,  1.64779761,  0.40812008,  1.33393502],
       [ 0.        , -1.43010279,  2.85851947, -0.15387284],
       [ 0.        , -0.02921787,  0.11758833,  0.16046368],
       [ 0.        , -0.15913152,  0.51348246, -0.41596259]])

 

 

Comments