array indexing

넘파이의 꽃이라고 하는 인덱싱은, 성분을 추출할 때 필요한 것이다.

  • 먼저 넘파이를 import하고, array를 하나 만들어진다. index는 0부터 시작하기 때문에, [5]는해서 6행or 6열으로 해석한다
    image
  • 1차원 array에 범위 인덱스를 적용해보자. 1차원 array의 index는 오로지 열의 index만을 의미한다.
    만약, arr[ 5: 8 ]이라고 입력하면, index가 5인 것(6열)부터  인덱스가 8인 것 전까지, 즉 index 7인 (8열 까지)다.
    예를 들어, arr[2:3]은 3열부터 3열까지니까 3열만 의미, arr[1:5]는 2열부터 5열까지 를 의미한다.
    숙달되어야한다. 범위 인덱스는 앞+1열(or행)부터 뒤열(or행)까지!!
    image
    이 때, 해당하는 index 5부터 7까지에 한 숫자를 모두 대입할 수 도 있다. arr[5:8] = 12
    image
    만약 범위인덱스가 비어있다면, arr[ : ]는 array의 전체 열(성분)들을 의미한다.
    image


2차원 array의 indexing을 살펴보자.

  • 2차원 array의 인덱스는 반드시 [  ,  ] 콤마를 기준으로 2개의 인자를 받는다.
    앞 인자는 행의 index를 의미한다. 뒤 인자는 열의 index이다. 여기에 콜론:을 넣으면, 모든 성분에 해당하는 것이다.
    image

    cf)범위 인덱싱 :  콜론(:)을 이용해서, 콜론 좌측에는 시작index를 / 콜론 우측에는 마지막index + 1값이 대입된다.
       그대로 n행 또는 n열까지라고 해석하자.
  • 행의 인덱스에도 범위인덱스를 적용할 수 있다.
    만약 arr2d[ 1:3 ,  : ]으로 행의 index에서 콜론(:)을 이용하여 index1부터 2까지를 의미하므로 2행과 3행을 불러올 수 있다.
    image
  • 이번에는 행의 index에다가, 전체를 의미하는 콜론을 넣고, 열의 인덱스에는 구체적으로 index를 적어주자.
    arr2d[ : , 3]은 1,2,3,4행 전체에 대해서 4번째 성분을 가져와서 배열을 만든다.
    즉, 1행의 4 2행의 8, 3행의 12, 4행의 16을 가져와서 새로운 array를 만든다.
    image
  • 열의 index에서 범위인덱스를 넣어보자. arr2d [ : , : 2] 에서 :2는 첨부터 index1까지를 의미하므로, 1열과 2열을 의미한다.
    image
  • 특정 원소만 가져오는 것은 가장 단순하다. [1,2]는 2행 3열이다.
    image
  • 특정 범위의 행x열에다가 0을 대입해보자. arr2d[:2, 1:3] = 0에서 행은 index 0, 1까지, 열은 index 1, 2까지를 의미한다.
    즉 행렬의 1행 2행의 2열 3열에다가 0을 입력한다.
    image



boolean Indexing

  • array 인덱싱 이외에도 불리언 indexing도 중요하다.
  • 데이터는 아래 코드를 복사해서 생성하자.
    names = np.array(["Charles", "Kilho", "Hayoung", "Charles", "Hayoung", "Kilho", "Kilho"])
    data = np.random.randn(7, 4)
    np.random.randn ( 7, 4 )라는 함수는 array의 성분을 랜덤으로 7X4 이차원array를 생성하는 함수다.
    image
  • 각 names의 성분(7개의 열)에 따라---> data의 각 행 대응된다고 생각해보자.
    예를 들어서, Charles라는 사람은 1행에, Kilho라는 사람은 2행의 데이터에 대응된다고 생각하고 아래처럼 array조건문을 입력해보자.
    image
  • names == "Charles"
  • array([ True, False, False,  True, False, False, False])
  • 이 결과 생성된 array는, 원래 성분이 7개인 names와 성분의 갯수가 동일하다. 근데 True나 False로만 이루어진 array이다.
    array에 조건문에 사용되는 [ == ] 를 사용했더니, names의 성분에 대응하여, 값이 “Charles”인 것과 동일한 것만 True, 다른 것은 False로서 성분이 구성된 array를 반환한다. 이것이 바로 boolean array 혹은 마스크 라고 한다.
    [ array == array 의 성분중 1개 ]  ====> [ true or false]로 구성된 마스크 array를 뽑아낸다.
  • 이러한 마스크는 다른 array의 행 또는 열의 인덱스에 집어넣어 인덱싱하는데 사용할 수 있다.
    아래와 같이 입력해보자.
    image
    data의 행index에, 숫자나 범위인덱스 대신 마스크를 넣었다. 그랬더니, 마스크에서 True1번째 성분과 4번째 성분에 해당하는 1번째 3번째 행만 뽑아내졌다. 
  • 마찬가지로 아래와 같이 입력해보자.
    image
    names == “kilho” 마스크를 행index에 넣어서, kilho가 들어있던 2,6,7번째 성분에 대응하여, data 중 2,6,7번째 행만 뽑아낸다.
    즉, 마스크를 이용해서 행이나 열을 인덱싱할 수 있다.
    array == array 의 성분중 1개  =>  true or false로 구성된 마스크 array => 행or열의 index에 들어가 해당 행or열을 뽑아낸다
    인덱스 자리 [행, ] or [ , 열 ]마스크를 집어넣으면, true에 해당하는 행or열만 뽑아낸다는 특징이 있는 것이다.

    image
  • 행index에서 뽑아낼 마스크를 2개로 줄 수 도 있다
    image
  • 기존의 데이터array의 성분에 조건문을 달아, boolean indexing 즉, 마스크를 만들 수 있다.
    (앞에서는 names라는 이름array를 기준으로 마스크를 만들었었다)
    data의 각 행의 4열만 뽑아보고,  그 array에 조건문을 달아서 마스크를 만들어보자.
    image
    이를 행index의 인덱싱으로 사용해보자. data[ data[:,3]< 0, : ]를 해석해보자면, 각 행 중 4열의 성분이 0보다 작은 행만 추출하는 것이다.
    image
    추출과 동시에 해당 행에 0을 대입해 줄 수 도 있다.
    image

+ Recent posts