[Python NumPy] 범용 함수(universal function) : (1-4) 삼각함수(trigonometric functions)
Python 분석과 프로그래밍/Python 데이터 전처리 2017. 3. 13. 23:58이전 포스팅에서는
- 범용함수(universal function, ufuncs)의 정의 및 유형
(1) 1개의 배열에 대한 ufuncs (Unary universal functions) 중에서
- (1-1) 올림 및 내림 범용 함수 (rounding ufuncs)
- (1-2) 합(sums), 곱(products), 차분(difference), gradient 범용함수
- (1-3) 지수함수(exponential function), 로그함수 (logarithmic function)
에 대해서 소개하였습니다.
이번 포스팅에서는 Unary ufuncs 4번째로
- (1-4) 삼각함수 (trigonometric functions)
에 대해서 알아보겠습니다.
고등학교 때 배웠던 삼각함수 공식을 복습하는 것으로 먼저 시작해보겠습니다. (이미 다 아는 이과생들은 pass... ^^; 긴가민가하는 문과생들은 복기... ^^;;;)
sine (줄여서 sin), cosine (줄여서 cos), tangent (줄여서 tan) 공식은 아래 밑변 AC, 높이 BC, 빗변 AB를 가지고 사이각이 (theta degree) 인 직각삼각형 ABC 를 가지고 삼각함수를 나타내본 것입니다.
[ 삼각함수 (Trigonometric Functions) ]
삼각함수는 어디에 쓰나 싶을 텐데요, 주기적인 파동형태를 띠는 함수 (예: 주파수, 물결 파동 등) 를 나타낼 때 sine function 을 사용합니다. 벡터 내적 계산할 때 cosine function 을 사용하기도 하구요. 고속 푸리에 변환 (FFT : Fast Fourier Transformation) 과 벡터 내적 계산 관련 자세한 내용은 아래 포스팅 링크 참고하세요.
참고로, degree는 우리가 일반적으로 사용하는 것처럼 원을 0~360도로 표기하는 방법이구요, radian은 부채꼴의 호의 길이와 반지름의 길이가 같게 되는 각도를 1 radian이라고 합니다.
180 degree = π radian 이며,
1 degree = π radian/180 ,
1 radian = 180 degree/ π = 57.3 의 관계가 있습니다. (슬슬 헷갈리기 시작하죠? -_-?)
Python NumPy의 삼각함수는 radian을 사용하기 때문에 degree 를 radian으로 바꿔주기 위해서 degree * np.py/180 을 해주었습니다. ( np.deg2rad(x) 함수를 사용해도 됨 )
(1-4-1) 삼각함수 (trigonometric functions) : np.sin(), np.cos(), np.tan() |
In [1]: import numpy as np In [2]: np.sin(np.array((0., 30., 45., 60., 90.))*np.pi / 180.) Out[2]: array([ 0. , 0.5 , 0.70710678, 0.8660254 , 1. ]) In [3]: np.cos(np.array((0., 30., 45., 60., 90.))*np.pi / 180.) Out[3]: array([ 1.00000000e+00, 8.66025404e-01, 7.07106781e-01, In [4]: np.tan(np.array((0., 30., 45., 60., 90.))*np.pi / 180.) Out[4]: array([ 0.00000000e+00, 5.77350269e-01, 1.00000000e+00,
|
참고로, 아래는 주요 Degree 혹은 radian 별 삼각함수 값 (Special values in trigonometric functions) 들입니다.
* 출처 : Wikipedia (https://en.wikipedia.org/wiki/Trigonometric_functions)
(1-4-2) 싸인 곡선 그리기 (plotting sine curve) |
In [5]: import matplotlib.pyplot as plt In [6]: x = np.arange(0, 2*np.pi, 0.1) In [7]: y = np.sin(x) In [8]: plt.plot(x, y) Out[8]: [<matplotlib.lines.Line2D at 0x94295f8>]
In [9]: plt.show()
|
주기적으로 원 회전 운동(a circular movement)을 하는 단자를 시간의 흐름(x축)에 따른 높낮이 변화(y축)를 시계열 그래프로 나타내면 그게 바로 위의 사인 곡선(sine curve)이 됩니다. 저 주기를 가지고 주파수를 계산할 때 FFT (Fast Fourier Transformation)을 사용하구요.
(1-4-3) 삼각함수의 역수 |
위 삼각함수의 역수인 cosecant (줄여서 csc), secant (줄여서 sec), cotangent (줄여서 cot) 함수는 아래와 같이 정의합니다.
(1-4-4) 역삼각함수 : np.arcsin(), np.arccos(), np.arctan |
In [10]: np.arcsin(1) # pi/2 Out[10]: 1.5707963267948966
In [11]: np.sin(1.5707963267948966) Out[11]: 1.0
In [12]: np.sin(np.arcsin(1)) Out[12]: 1.0
In [13]: np.arcsin([-1, 0, 1]) # real part lies in [-pi/2, pi/2] Out[13]: array([-1.57079633, 0. , 1.57079633]) In [14]: np.arccos([-1, 0, 1]) # real part lies in [0, pi] Out[14]: array([ 3.14159265, 1.57079633, 0. ]) In [15]: np.arctan([-1, 0, 1]) # real part lies in [-pi/2, pi/2] Out[15]: array([-0.78539816, 0. , 0.78539816])
|
(1-4-5) degree를 radian으로 변환 : np.deg2rad(x) radian을 degree로 변환 : np.rad2deg(x) |
degree를 radian으로 바꾸고 싶을 때는 np.deg2rad(x) 함수를 사용하면 되구요,
radian을 degree로 바꾸고 싶을 때는 np.rad2deg(x) 함수를 사용하면 됩니다.
# Convert angles from degrees to radians : np.deg2rad
In [16]: np.deg2rad(180) Out[16]: 3.1415926535897931
# Convert angles from radians to degrees : np.rad2deg In [17]: np.rad2deg(np.pi) Out[17]: 180.0
|
많은 도움 되었기를 바랍니다.