이전 포스팅에서는

 

 - 범용함수(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,
          5.00000000e-01,   6.12323400e-17])


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,
          1.73205081e+00,   1.63312394e+16])

 

 

 

 

 

참고로, 아래는 주요 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
# deg2rad(x) is x * pi / 180

 

In [16]: np.deg2rad(180)

Out[16]: 3.1415926535897931

 

 

# Convert angles from radians to degrees : np.rad2deg
# rad2deg(x) is 180 * x / pi

In [17]: np.rad2deg(np.pi)

Out[17]: 180.0

 

 

 

 

많은 도움 되었기를 바랍니다. 

 

 

Posted by R Friend R_Friend

이번 포스팅부터는 몇 번에 나누어서 로그함수, 삼각함수, 사칙연산 함수 등과 같이 일반적으로 많이 사용되는 범용 함수 (universal functions)들에 대해서 소개하겠습니다.

 

Python에서 범용 함수를 지원하는 모듈이 여러개 있습니다. 

 

Pytho 배울 때 초반에 배우는 math module은 실수(real number)에 대해서만 범용함수를 지원하며, cmath module 은 복소수(complex number) 까지 범용함수를 지원합니다. numpy module은 실수, 복소수, 복소수 행렬 (complex matrix)의 원소 간 범용 함수를 모두 지원하므로 사용 범위가 가장 넓어 매우 유용합니다.  배열의 원소간 연산을 위해 NumPy의 Ufunc 함수는 쓸모가 많습니다. NumPy는 맥가이버 칼 같다고나 할까요.

 

[ Python modules for Universal Functions ]

 

 

 

 

NumPy 범용 함수는 몇 개의 배열에 대해 적용이 되는지에 따라서

 - (1) 1개의 배열에 적용하는 Unary Universal Functions (ufuncs)

 - (2) 2개의 배열에 대해 적용하는 Binary Universal Functions (ufuncs)

으로 구분할 수 있습니다.

 

범용함수 종류가 너무 많아서 포스팅에 한꺼번에 소개하기가 버거우므로, 서너번에 나누어서 Unary Universal Functions를 먼저 소개하고, 다음으로 Binary Ufuncs  순서로 알아보겠습니다.

 

 

 

 

  (1-1) 올림 혹은 내림 범용 함수 (round universal functions)

 

비슷비슷한 함수들이 여러개 있는데요, 말로 설명하는 것보다 예를 자세히 살펴보고 비교해보는 것이 이해하기에 쉽고 빠를 것 같습니다.

 

 

# import module and making an array

In [1]: import numpy as np


In [2]: a = np.array([-4.62, -2.19, 0, 1.57, 3.40, 4.06])


In [3]: a

Out[3]: array([-4.62, -2.19, 0. , 1.57, 3.4 , 4.06])

 

 

 

 (1-1-1) np.around(a) : 0.5를 기준으로 올림 혹은 내림

 

 

# np.around(a) : Evenly round to the given number of decimals

 

In [3]: a

Out[3]: array([-4.62, -2.19, 0. , 1.57, 3.4 , 4.06])

 

In [4]: np.around(a)

Out[4]: array([-5., -2., 0., 2., 3., 4.]) 

 

 

 

 

 (1-1-2) np.round_(a, N) : N 소수점 자릿수까지 반올림

 

  

# np.round_(a, n) : Round an array to the given number of decimals

 

In [3]: a

Out[3]: array([-4.62, -2.19, 0. , 1.57, 3.4 , 4.06])

 

In [5]: np.round_(a, 1)

Out[5]: array([-4.6, -2.2, 0. , 1.6, 3.4, 4.1]) 

 

 

 

 

 (1-1-3) np.rint(a) : 가장 가까운 정수로 올림 혹은 내림

 

 

# round elements to the nearest integer

 

In [3]: a

Out[3]: array([-4.62, -2.19, 0. , 1.57, 3.4 , 4.06])

 

In [6]: np.rint(a)

Out[6]: array([-5., -2., 0., 2., 3., 4.])

 

 

 

 

 (1-1-4) np.fix(a) : '0' 방향으로 가장 가까운 정수로 올림 혹은 내림

 

 

# Round to nearest integer towards zero

 

In [3]: a

Out[3]: array([-4.62, -2.19, 0. , 1.57, 3.4 , 4.06])

 

In [7]: np.fix(a)

Out[7]: array([-4., -2., 0., 1., 3., 4.])

 

 

 

 

 (1-1-5) np.ceil(a) : 각 원소 값보다 크거나 같은 가장 작은 정수 값 (천장 값)으로 올림

 

 

# the smallest integer greater than or equal to each element 

 

In [3]: a

Out[3]: array([-4.62, -2.19, 0. , 1.57, 3.4 , 4.06])

 

In [8]: np.ceil(a)

Out[8]: array([-4., -2., 0., 2., 4., 5.])

 

 

 

 

 (1-1-6) np.floor(a) : 각 원소 값보다 작거나 같은 가장 큰 정수 값 (바닥 값)으로 내림

 

 

# the largest integer less than or equal to each element

 

In [3]: a

Out[3]: array([-4.62, -2.19, 0. , 1.57, 3.4 , 4.06])

 

In [9]: np.floor(a)

Out[9]: array([-5., -3., 0., 1., 3., 4.])

 

 

 

 

 (1-1-7) np.trunc(a) : 각 원소의 소수점 부분은 잘라버리고 정수값만 남김

 

 

# Return the truncated value of the input, element-wise

 

In [3]: a

Out[3]: array([-4.62, -2.19, 0. , 1.57, 3.4 , 4.06])

 

In [10]: np.trunc(a)

Out[10]: array([-4., -2., 0., 1., 3., 4.])

 

 

 

다음번 포스팅에서는 단일 배열 범용 함수의 두번째 순서로 합(sums), 곱(products), 차분(difference), 미분(gradient) 함수에 대해서 알아보도록 하겠습니다.

 

많은 도움 되었기를 바랍니다.

 

 

Posted by R Friend R_Friend