7. Numpy array 인덱싱( 기본인덱싱, boolean인덱싱(마스크))
2018. 2. 23. 01:31
array indexing
넘파이의 꽃이라고 하는 인덱싱은, 성분을 추출할 때 필요한 것이다.
- 먼저 넘파이를 import하고, array를 하나 만들어진다. index는 0부터 시작하기 때문에, [5]는해서 6행or 6열으로 해석한다
- 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행)까지!!
이 때, 해당하는 index 5부터 7까지에 한 숫자를 모두 대입할 수 도 있다. arr[5:8] = 12
만약 범위인덱스가 비어있다면, arr[ : ]는 array의 전체 열(성분)들을 의미한다.
2차원 array의 indexing을 살펴보자.
- 2차원 array의 인덱스는 반드시 [ , ] 콤마를 기준으로 2개의 인자를 받는다.
앞 인자는 행의 index를 의미한다. 뒤 인자는 열의 index이다. 여기에 콜론:을 넣으면, 모든 성분에 해당하는 것이다.
cf)범위 인덱싱 : 콜론(:)을 이용해서, 콜론 좌측에는 시작index를 / 콜론 우측에는 마지막index + 1값이 대입된다.
그대로 n행 또는 n열까지라고 해석하자. - 행의 인덱스에도 범위인덱스를 적용할 수 있다.
만약 arr2d[ 1:3 , : ]으로 행의 index에서 콜론(:)을 이용하여 index1부터 2까지를 의미하므로 2행과 3행을 불러올 수 있다. - 이번에는 행의 index에다가, 전체를 의미하는 콜론을 넣고, 열의 인덱스에는 구체적으로 index를 적어주자.
arr2d[ : , 3]은 1,2,3,4행 전체에 대해서 4번째 성분을 가져와서 배열을 만든다.
즉, 1행의 4 2행의 8, 3행의 12, 4행의 16을 가져와서 새로운 array를 만든다. - 열의 index에서 범위인덱스를 넣어보자. arr2d [ : , : 2] 에서 :2는 첨부터 index1까지를 의미하므로, 1열과 2열을 의미한다.
- 특정 원소만 가져오는 것은 가장 단순하다. [1,2]는 2행 3열이다.
- 특정 범위의 행x열에다가 0을 대입해보자. arr2d[:2, 1:3] = 0에서 행은 index 0, 1까지, 열은 index 1, 2까지를 의미한다.
즉 행렬의 1행 2행의 2열 3열에다가 0을 입력한다.
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를 생성하는 함수다. - 각 names의 성분(7개의 열)에 따라---> data의 각 행 대응된다고 생각해보자.
예를 들어서, Charles라는 사람은 1행에, Kilho라는 사람은 2행의 데이터에 대응된다고 생각하고 아래처럼 array조건문을 입력해보자. 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의 행 또는 열의 인덱스에 집어넣어 인덱싱하는데 사용할 수 있다.
아래와 같이 입력해보자.
data의 행index에, 숫자나 범위인덱스 대신 마스크를 넣었다. 그랬더니, 마스크에서 True인 1번째 성분과 4번째 성분에 해당하는 1번째 3번째 행만 뽑아내졌다. - 마찬가지로 아래와 같이 입력해보자.
names == “kilho” 마스크를 행index에 넣어서, kilho가 들어있던 2,6,7번째 성분에 대응하여, data 중 2,6,7번째 행만 뽑아낸다.
즉, 마스크를 이용해서 행이나 열을 인덱싱할 수 있다.
array == array 의 성분중 1개 => true or false로 구성된 마스크 array => 행or열의 index에 들어가 해당 행or열을 뽑아낸다
인덱스 자리 [행, ] or [ , 열 ]에 마스크를 집어넣으면, true에 해당하는 행or열만 뽑아낸다는 특징이 있는 것이다. - 행index에서 뽑아낼 마스크를 2개로 줄 수 도 있다
- 기존의 데이터array의 성분에 조건문을 달아, boolean indexing 즉, 마스크를 만들 수 있다.
(앞에서는 names라는 이름array를 기준으로 마스크를 만들었었다)
data의 각 행의 4열만 뽑아보고, 그 array에 조건문을 달아서 마스크를 만들어보자.
이를 행index의 인덱싱으로 사용해보자. data[ data[:,3]< 0, : ]를 해석해보자면, 각 행 중 4열의 성분이 0보다 작은 행만 추출하는 것이다.
추출과 동시에 해당 행에 0을 대입해 줄 수 도 있다.
'빅데이터 관련 프로그래밍 > Python - bigdata(pandas 기초)' 카테고리의 다른 글
9. Numpy 데이터분석 해보기(파일읽기, 분석하기(고난도), 파일쓰기) (0) | 2018.02.23 |
---|---|
8. Numpy array 함수( 특정계산, 통계함수, 정렬함수) (0) | 2018.02.23 |
6. 기초 라이브러리 Numpy(넘파이) 사용하기 (import, 데이터형, array연산) (0) | 2018.02.22 |
5. iPhython Notebook 살펴보기 (1) | 2018.02.22 |
4. iPython 살펴보기 (0) | 2018.02.22 |