티스토리 뷰

import numpy as np

 

⊙ Boolean 값으로 선택하기 

중복된 이름이 포함된 배열 names가 있다.

numpy.random 모듈의 .randn 함수를 사용해 임의의 표준정규분포데이터를 생성한다. 

각 이름이 data 배열의 row에 대응한다고 가정하자.

names = np.array(['Bob', 'Joe', 'Will', 'Joe', 'Bob', 'Will', 'Joe'])
data = np.random.randn(7, 4)

만약 전체 row에서 'Bob'과 같은 이름을 선택하려 할 때 산술 연산과 마찬가지로 배열에 대한 비교 연산도 벡터화되므로 names를 'Bob' 문자열과 비교하면 Boolean 배열을 반환한다. 

names == 'Bob'

쉽게 말해 'Bob'이면 True, 아니면 False를 반환한다는 뜻이다.  

이런 식으로.

그래서 이 Boolean 배열은 색인으로 활용할 수 있다. 

data[names == 'Bob']

Bob에 대응하는 임의의 숫자만 골라진 것을 확인할 수 있다. 

다만 Boolean 배열의 길이는 색인하려는 축의 길이와 같아야 한다.

한편 != 연산자나 ~로 Bob이 아닌 친구들만 골라낼 수도 있을 것이다. 

names != 'Bob'
data[~(names == 'Bob')]
cond = names == 'Bob'
data[~cond]

& 또는 | 과 같은 논리연산자를 사용해서 두 개 이상의 조건을 설정할 수도 있다. 

mask == (names == 'Bob') | (names == 'Will')
mask
data[mask]

배열에 Boolean 색인을 적용해 데이터를 선택하면 반환되는 배열의 내용이 바뀌지 않더라도 항상 데이터 복사가 발생한다. 

어쨌든 2차원 데이터에 대한 이런 연산은 pandas를 활용하는 것이 조금 더 편하다.