Boolean-Arrays-And-Masks
Boolean-Arrays-And-Masks
Comparisons, Masks, and Boolean Logic
1
2
3
4
5
6
import numpy as np
import pandas as pd
rainfall = pd.read_csv('./Seattle2014.csv')['PRCP'].values
inches = rainfall / 254 # 1/10mm --> inches
print("inches.shape: ", inches.shape)
1
inches.shape: (365,)
Ufunc 비교 연산자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x = np.array([1, 2, 3, 4, 5])
print("x: ", x)
print("x < 3: ", x < 3)
print("x > 3: ", x > 3)
print("x <= 3: ", x <= 3)
print("x >= 3: ", x >= 3)
print("x != 3: ", x != 3)
# 복합 표현식 --> 두 배열 항목별 비교
print("\n(2 * x) == (x ** 2): ", (2 * x) == (x ** 2))
# 2차원
rng = np.random.RandomState(0)
x = rng.randint(10, size=(3, 4))
print("\nx: \n", x)
print("\nx < 6: \n", x < 6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
x: [1 2 3 4 5]
x < 3: [ True True False False False]
x > 3: [False False False True True]
x <= 3: [ True True True False False]
x >= 3: [False False True True True]
x != 3: [ True True False True True]
(2 * x) == (x ** 2): [False True False False False]
x:
[[5 0 3 3]
[7 9 3 5]
[2 4 7 6]]
x < 6:
[[ True True True True]
[False False True True]
[ True True False False]]
| Operator | Equivalent ufunc | Operator | Equivalent ufunc |
|---|---|---|---|
== | np.equal | != | np.not_equal |
< | np.less | <= | np.less_equal |
> | np.greater | >= | np.greater_equal |
부울 배열로 작업
요소 개수 세기
1
2
3
4
5
6
7
8
9
10
11
12
13
# 요소 개수 세기
print("x: \n", x)
# True인 요소의 개수
print("\nnp.count_nonzero(x < 6): ", np.count_nonzero(x < 6))
# False는 0으로, True는 1로 해석
print("\nnp.sum(x < 6): ", np.sum(x < 6))
# 집계함수와 같이 행이나 열에 따른 계산 가능
print("np.sum(x < 6, axis=1): ", np.sum(x < 6, axis=1))
# 값 중 참이 있는지 확인
print("\nnp.any(x > 8): ", np.any(x > 8)) # 하나의 값 기준
print("np.all(x < 10): ", np.all(x < 10)) # 모든 값 기준
print("\nnp.any(x > 8, axis=1): ", np.any(x > 8, axis=1))
print("np.all(x < 8, axis=0): ", np.all(x < 8, axis=0))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
x:
[[5 0 3 3]
[7 9 3 5]
[2 4 7 6]]
np.count_nonzero(x < 6): 8
np.sum(x < 6): 8
np.sum(x < 6, axis=1): [4 2 2]
np.any(x > 8): True
np.all(x < 10): True
np.any(x > 8, axis=1): [False True False]
np.all(x < 8, axis=0): [ True False True True]
부울 연산자
| Operator | Equivalent ufunc | Operator | Equivalent ufunc |
|---|---|---|---|
& | np.bitwise_and | | | np.bitwise_or |
^ | np.bitwise_xor | ~ | np.bitwise_not |
1
2
print("np.sum((inches > 0.5) & (inches < 1)): ", np.sum((inches > 0.5) & (inches < 1)))
print("np.sum(~((inches <= 0.5) | (inches >= 1))): ", np.sum(~((inches <= 0.5) | (inches >= 1))))
1
2
np.sum((inches > 0.5) & (inches < 1)): 29
np.sum(~((inches <= 0.5) | (inches >= 1))): 29
마스크로서의 부울 배열
1
2
3
4
5
6
7
8
9
10
print("x: \n", x)
print("\nx[x < 5]: ", x[x < 5]) # 마스킹 연산 --> 부울(마스크) 배열에서 True값 반환
# Example
rainy = (inches > 0)
summer = (np.arange(365) - 172 < 90) & (np.arange(365) - 17 > 0)
print("\nnp.median(inches[rainy]): ", np.median(inches[rainy]))
print("np.median(inches[summer]): ", np.median(inches[summer]))
print("np.max(inches[summer]): ", np.max(inches[summer]))
print("np.median(inches[rainy & ~summer]): ", np.median(inches[rainy & ~summer]))
1
2
3
4
5
6
7
8
9
10
11
x:
[[5 0 3 3]
[7 9 3 5]
[2 4 7 6]]
x[x < 5]: [0 3 3 3 2 4]
np.median(inches[rainy]): 0.19488188976377951
np.median(inches[summer]): 0.0
np.max(inches[summer]): 1.8385826771653544
np.median(inches[rainy & ~summer]): 0.20866141732283464
키워드 사용
1
2
3
4
5
6
7
8
9
10
# and / or --> 객체를 부울 요소로 취급
x = bool(33)
y = bool(0)
print("x:", x, "\ny:", y)
print("x and y:", x and y, "\nx or y:", x or y)
# & / | --> 비트를 비교(배열에 사용)
print("\nbin(33):", bin(33), "\nbin(55):", bin(55))
print("bin(33 & 55):", bin(33 & 55))
print("bin(33 | 55):", bin(33 | 55))
1
2
3
4
5
6
7
8
9
x: True
y: False
x and y: False
x or y: True
bin(33): 0b100001
bin(55): 0b110111
bin(33 & 55): 0b100001
bin(33 | 55): 0b110111
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.