기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

[python] 연산자(Operator) I: 산술, 비교, 논리 연산자

1.4 연산자(operator)

데이터들 사이에 연산이 필요한 경우 연산의 종류를 구분하기 위한 약속이 존재합니다. 이 약속된 규칙 또는 표현을 연산자(operator)라고 합니다. 연산자는 특정한 명령(들)을 수행하기 위한 여러 코드들을 그룹화하는 함수입니다.

파이썬은 산술, True 또는 False의 결과를 반환하는 논리 연산 등을 수행하기 위한 다양한 연산자들을 제공하고 있으며 이 연산에 참여하는 값들을 피연산자(operand)라고 합니다. 예를 들어 다음 코드는 두 수치형 리터럴의 덧셈을 실행한 것입니다.

5+8
13

두 정수의 덧셈연산은 연산자 '+'에 의해 실행되며 이 연산에 관계된 5와 8이 피연산자가 됩니다. 그 연산의 결과는 13입니다.

산술 연산자(Arithmatic operators)

표 1은 두 객체에 대한 산술 연산을 실행하기 위한 연산자 입니다.

표 1 산술연산자
연산자 의미
x + y 단일 또는 두개의 피연사자의 덧셈
x - y 단일 또는 두개의 피연사자의 뺄셈
x * y 두개의 피연사자의 곱셈
x / y 두개의 피연사자의 나눗셈으로 결과는 실수형
x % y 두개의 피연사자의 나눗셈의 나머지를 반환
x // y 두개의 피연사자의 나눗셈의 몫을 반환
x**y 피연산자의 거듭제곱 (power)
x=5
y=2
print(x+y) # 덧셈
print(x-y) # 뺄셈
print(x*y) # 곱셈
print(x/y) # 나눗셈
7
3
10
2.5
print(x//y) # 몫
print(x%y) # 나머지
2
1
print(x**y) # 거듭제곱
25

다음 코드의 경우 두 정수의 나눗셈은 실수를 반환합니다.

121/5
24.2

위 코드에서 정수 121은 5에 의해 나누어진 몫과 나머지를 사용하여 다음과 같이 나타낼 수 있습니다.

121 = 24.2 ⇒ 5 × 24 + 1
5

즉, 이 나눗셈 연산은 몫 24와 나머지 1을 나타냅니다. 파이썬에서는 '//' 연산자를 사용하여 몫만을 나타내고 나머지는 '%' 연산자를 사용하여 반환할 수 있습니다.

121 // 5
24
121 % 5
1

내장함수인 divmod(분모, 분자)를 사용하여 몫과 나머지를 확인할 수 있습니다.

divmod(121, 5)
(24, 1)

비교연산자(comparison operatores)

표 2와 같이 두 개 이상의 값들을 비교하여 불리언(boolean) 값 즉, True 또는 False를 반환합니다.

표 2 비교연산자
연산자 의미
x > y x가 y 보다 크면 True
x< y x가 y 보다 작으면 True
x == y x와 y가 같으면 True
x != y x, y가 같지 않으면 True
x >= y x가 y보다 크거나 같은면 True
x <= y x가 y보다 작거나 같은면 True

x=5
y=2
print(x>y)
print(x<y)
True
False
print(x==y)
print(x!=y)
False
True
print(x>=y)
print(x<=y)
True
False

내장함수 bool()을 사용하여 정수, 실수, 문자열을 True/False 즉, 불리언 값으로 나타낼 수 있습니다. 0, False, None 값만이 False를 생성합니다.

print(bool(None))
print(bool(0))
print(bool(False))
False
False
False

다음 코드의 "False"는 불리언 값이 아닌 문자열입니다.

print(bool(1))
print(bool(1.23))
print(bool("False"))
True
True
True

논리연산자(logical operators)

비교 연산자는 객체들의 비교에 의한 결과로 불리언 값을 반환하는 것이라면 논리 연산자는 불리언 값들 사이의 연산을 위한 것입니다.

이전 절에서 bool() 함수에 의해 0은 False, 1은 True를 반환합니다. 이것은 불리언 값을 수치형으로 변환하여 연산하는 것이 가능함을 의미합니다.

print(int(False))
print(float(True))
0
1.0
1.0==True
True
False==0.0
True

파이썬에서 다음을 제외한 모든 객체는 True입니다. 즉, 다음의 경우 False입니다.

  1. None
  2. False
  3. 0
  4. list, tuple, string등의 요소가 없는 상태 즉, [],(), ""
  5. 매핑 유형의 자료형인 사전(dictionary), 집합(set) 등의 요소가 없는 상태 즉, {}
bool(None)
False
bool(0), bool(200)
(False, True)
bool([])
False
bool({})
False

불리언 값들의 결합에 의한 판단을 위한 것으로 and, or, 그리고 not 연산자를 사용합니다. 이 연산자들을 사용하여 두 개이상의 비교연산의 결과들에 의한 결정이 가능해 집니다.

and 연산자

and 연산자는 논리연산자로서 일반적으로 불리언 값 값에 대해 작동하며 True 또는 False를 반환합니다. 표 3과 같이 두 피연산자(operand) x, y의 bool(True 또는 False)에 따라 다음을 반환합니다.

표 3 and 연산자
x yx and y
True True True
True False False
False True False
False False False
x, y=0, 1
x and y
 0
bool(x and y)
 False

표 3에서와 같이 and 연산자는 두 가지 특징이 있습니다.

  1. x가 True로 평가될 경우만 y를 평가합니다.
  2. x가 True일 경우 결과는 y의 평가에 의해 좌우 됩니다.

그러므로 위 예에서 x가 False이면 y는 평가되지 않습니다. 이러한 과정을 알아보기 위해 다음 코드를 실행해 봅니다.

다음 코드에서 객체 b의 값은 0입니다. 어떤 수든지 0으로는 나누어 질수 없습니다. 그러므로 실행 중에 에러가 발생합니다. 이러한 에러를 실행에러(run time error)라고 하며 다음 코드의 결과인 zeroDivisionError는 그 중의 하나입니다. 파이썬은 코드 작성과 실행중에 발생할 에러들에 대해 목록화하여 나타냅니다.

a, b=10, 0
bool(a/b)
ZeroDivisionError: division by zero

다음 코드와 같이 객체 a, b에 대해 and 연산자를 실행하면 예외는 발생하지 않습니다. 즉, 연산자 이전의 객체가 False 이므로 이후의 객체에 대한 평가는 이루어지지 않습니다.

b and a/b
 0

b를 5로 교체하면 and 연산자 이전의 평가는 True가 되고 그 연산의 결과는 연산자 이후 값이 됩니다. 즉, and 연산자의 두번째 특징을 나타냅니다.

b=5
b and a/b
 2.0

or 연산자

or 연산자는 표 4와 같이 실행됩니다.

표 4 or 연산자
x yx or y
True True True
True False True
False True True
False False False

x or y 연산은 다음의 특징을 가집니다.

  1. x가 True일 경우 x를 반환 즉, y는 평가하지 않습니다.
  2. x가 False일 경우 y 만을 평가하고 그 결과를 반환합니다.
a, b=10, 5
b or a/b
 5
b=0
b or a/b
ZeroDivisionError: division by zero

not 연산자

연산자 not은 객체의 값을 반전시킵니다(표 5).

표 5 not 연산자
연산자 의미
not x True → False
False → True
x=True
y=False
x and y
False
x or y
True
not x
False

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b