NumPy where 함수를 사용하여 여러 조건 충족 데이터 추출하기
기본 사용법
where
함수는 다음과 같은 기본 구조를 가지고 있습니다.
import numpy as np
array = np.array(...) # 입력 배열
condition = ... # 조건식
true_values = ... # 조건이 참일 때 반환할 값
false_values = ... # 조건이 거짓일 때 반환할 값
result = np.where(condition, true_values, false_values)
condition
: 조건을 나타내는 배열 또는 스칼라 값입니다.true_values
:condition
이 참일 때 반환할 값들의 배열입니다.result
: 조건에 따라true_values
또는false_values
로 채워진 새로운 배열을 반환합니다.
예를 들어, 다음 코드는 array
배열에서 5보다 큰 모든 값을 2배로 변환합니다.
array = np.array([1, 2, 3, 4, 5, 6, 7, 8])
result = np.where(array > 5, 2 * array, array)
print(result) # 결과: [1 2 3 4 5 12 14 16]
여러 조건 충족 데이터 추출
여러 조건을 충족하는 데이터를 추출하기 위해서는 조건식을 논리 연산자 (and
, or
)를 사용하여 조합해야 합니다.
and
: 모든 조건이 참일 때만True
를 반환합니다.or
: 하나 이상의 조건이 참일 때True
를 반환합니다.
array = np.array([1, 2, 3, 4, 5, 6, 7, 8])
condition = (array > 5) & (array % 2 == 0)
result = np.where(condition, array, -1)
print(result) # 결과: [6 8 -1 -1 -1 -1 -1 -1]
위 코드에서 condition
은 array > 5
와 array % 2 == 0
의 and
연산 결과입니다. 즉, array
배열의 값이 5보다 크고 짝수인 경우에만 True
를 반환합니다. result
는 condition
이 True
인 경우 array
의 값을, False
인 경우 -1을 반환합니다.
조건별 다양한 값 반환
where
함수는 여러 조건에 따라 서로 다른 값을 반환하도록 설정할 수 있습니다.
예를 들어, 다음 코드는 array
배열에서 5보다 작은 값은 0으로, 5보다 크고 짝수인 값은 2배, 그 외 값은 100으로 변환합니다.
array = np.array([1, 2, 3, 4, 5, 6, 7, 8])
result = np.where(array <= 5, 0, np.where(array % 2 == 0, 2 * array, 100))
print(result) # 결과: [0 2 0 4 100 12 100 16]
위 코드에서 np.where(array % 2 == 0, 2 * array, 100)
는 array
배열의 값이 짝수인 경우 2배를, 그렇지 않은 경우 100을 반환하는 중첩된 where
함수입니다.
NumPy where
함수를 활용한 다양한 조건 처리 예제
import numpy as np
# 데이터 생성
array = np.random.randint(10, 100, 10)
# 50보다 크고 70보다 작은 값 추출
result = np.where((array > 50) & (array < 70), array, -1)
print(result)
설명:
np.random.randint(10, 100, 10)
: 10부터 99까지 범위의 10개의 난수를 생성하여array
배열에 저장합니다.(array > 50) & (array < 70)
:array
배열의 값이 50보다 크고 70보다 작은 조건을 만족하는지 판단하는 논리 배열을 생성합니다.np.where(조건, 참_값, 거짓_값)
: 조건이 참일 경우array
의 값을, 거짓일 경우 -1을 반환하여 새로운 배열result
를 생성합니다.
짝수/홀수 구분:
import numpy as np
# 데이터 생성
array = np.random.randint(1, 10)
# 짝수/홀수 구분하여 각 그룹의 최댓값 추출
even_max = np.where(array % 2 == 0, array, -1).max()
odd_max = np.where(array % 2 == 1, array, -1).max()
print("짝수 그룹 최댓값:", even_max)
print("홀수 그룹 최댓값:", odd_max)
array % 2 == 0
:array
배열의 각 값이 짝수인지 판단하는 논리 배열을 생성합니다..max()
: 각 그룹 배열의 최댓값을 추출합니다.
특정 값으로 나누어 몫과 나머지 구분:
import numpy as np
# 데이터 생성
dividend = np.random.randint(1, 100)
divisor = 7
# 몫과 나머지 구분하여 출력
quotient, remainder = np.where(dividend % divisor == 0, dividend // divisor,
(dividend, divisor))
print("몫:", quotient)
print("나머지:", remainder)
dividend % divisor == 0
:dividend
가divisor
로 나누어 떨어지는지 판단하는 논리 배열을 생성합니다.np.where(조건, 참_값, 거짓_값)
: 조건이 참일 경우dividend // divisor
(몫 계산), 거짓일 경우(dividend, divisor)
(튜플 형태로 값 그대로)를 반환하여 새로운 배열quotient
와remainder
를 생성합니다.
문자열 비교 및 조건에 따른 처리:
import numpy as np
# 데이터 생성
names = np.array(['Alice', 'Bob', 'Charlie', 'David', 'Emily'])
ages = np.array([30, 25, 27, 31, 28])
# 30세 이상인 사람들의 이름과 나이 출력
result = np.where(ages >= 30, (names, ages), (-1, -1))
print(result)
ages >= 30
:ages
배열의 값이 30 이상인지 판단하는 논리 배열을 생성합니다.np.where(조건, 참_값, 거짓_값)
: 조건이 참일 경우(names, ages)
(이름과 나이 튜플), 거짓일 경우(-1, -1)
(기본값)을 반환하여 새로운 배열result
를 생성합니다.
다중 조건 처리:
import numpy as np
#
NumPy where
함수 대신 활용 가능한 대체 방법들
벡터 연산:
- 조건이 간단하고 벡터 연산으로 표현 가능한 경우,
where
함수 대신 벡터 연산을 활용하는 것이 더 효율적일 수 있습니다.
import numpy as np
# 데이터 생성
array = np.random.randint(10, 100, 10)
# 50보다 큰 값만 추출 (where 함수 대체)
result = array[array > 50]
print(result)
팬시 인덱싱:
- 특정 조건을 충족하는 데이터의 인덱스를 추출한 후, 해당 인덱스를 사용하여 원하는 값을 추출하는 방법입니다. 팬시 인덱싱은
where
함수보다 코드가 간결하고 직관적일 수 있습니다.
import numpy as np
# 데이터 생성
array = np.random.randint(10, 100, 10)
# 50보다 큰 값만 추출 (where 함수 대체)
result = array[array > 50]
print(result)
np.take 함수:
- 조건에 따라 특정 요소만 선택하여 새로운 배열을 만드는
np.take
함수를 활용할 수 있습니다.
import numpy as np
# 데이터 생성
array = np.random.randint(10, 100, 10)
indices = np.where(array > 50)[0] # 50보다 큰 값의 인덱스 추출
# 50보다 큰 값만 추출 (where 함수 대체)
result = np.take(array, indices)
print(result)
np.isin 함수:
- 특정 값 목록에 포함된지 여부를 판단하는
np.isin
함수를 사용하여 조건을 처리하고 결과 배열을 생성할 수 있습니다.
import numpy as np
# 데이터 생성
array = np.random.randint(1, 10)
values = [2, 5, 8] # 특정 값 목록
# 특정 값 목록에 포함된 값만 추출 (where 함수 대체)
result = array[np.isin(array, values)]
print(result)
리스트 추 comprehension:
- 조건이 간단하고 결과 배열의 길이가 미리 예상 가능한 경우, 리스트 추 comprehension을 사용하여 간결하게 코드를 작성할 수 있습니다.
import numpy as np
# 데이터 생성
array = np.random.randint(10, 100, 10)
# 50보다 큰 값만 추출 (where 함수 대체)
result = [x for x in array if x > 50]
print(result)
주의 사항:
- 위에 제시된 대체 방법들은 모두 특정 상황에 따라 적합하며,
where
함수보다 빠르거나 간결할 수 있습니다. 하지만, 모든 경우에where
함수를 대체할 수 있는 것은 아니며, 상황에 맞는 도구를 선택하는 것이 중요합니다. - 코드의 가독성, 유지 관리성, 그리고 처리 속도를 고려하여 적절한 방법을 선택해야 합니다.
python numpy