이전 포스팅에서는
 
 - 범용함수(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)

 - (1-4) 삼각함수(trigonometric functions) 

 - (1-5) 절대값(absolute), 제곱근(square root), 제곱값(square), 정수와 소수점 값 분리(integral and fractional parts), 부호(sign) 판별 함수

 

등에 대해서 알아보겠습니다.

 

 

이번 포스팅에서는 (1-6) 1개 배열 대상의 논리 범용 함수(Logic Unary ufuncs) 에 대해서 알아보겠습니다. 논리 함수(logic functions)는 참(True) 또는 거짓(False)의 boolean 값을 반환합니다.

 

 

 

 

 

  (1-6-1) 배열의 원소에 대한 논리 함수 (logic functions for array contents)

 

  (1-6-1-1) 배열에 NaN(Not a Number) 포함 여부 확인 함수 : np.isnan(x)

 

 

# isnan : Test element-wise for NaN(Not a Number) and return result as a boolean array

 

In [1]: import numpy as np


In [2]: a = np.array([0, 1, 2, np.nan, 4, np.inf, np.NINF, np.PINF])


In [3]: a

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


In [4]: np.isnan(a)

Out[4]: array([False, False, False, True, False, False, False, False], dtype=bool)

 

 

 

 

  (1-6-1-2) 배열에 유한수(finite number) 포함 여부 확인 함수 : np.isfinite(x)

 

 

# isfinite : Test element-wise for finiteness (not infinity or not Not a Number)

 

In [5]: a

Out[5]: array([ 0., 1., 2., nan, 4., inf, -inf, inf])


In [6]: np.isfinite(a)

Out[6]: array([ True, True, True, False, True, False, False, False], dtype=bool)

 

 

 

 

 (1-6-1-3) 배열에 무한수(infinite number) 포함 여부 확인 함수 : np.isinf(x)

 

 

# isinf : Test element-wise for positive or negative infinity

 

In [7]: a

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

 

In [8]: np.isinf(a)

Out[8]: array([False, False, False, False, False, True, True, True], dtype=bool)

 

 

 

 

  (1-6-1-4) 배열에 음의 무한수 포함 여부 : np.isneginf(x)

 

 

# isneginf : Test element-wise for negative infinity, return result as bool array

 

In [9]: a

Out[9]: array([ 0., 1., 2., nan, 4., inf, -inf, inf])

 

In [10]: np.isneginf(a)

Out[10]: array([False, False, False, False, False, False, True, False], dtype=bool)

 

 

 

 

  (1-6-1-5) 배열에 양의 무한수 포함 여부 확인 함수 : np.isposinf(x)

 

 

# isposinf : Test element-wise for positive infinity, return result as bool arry

 

In [11]: a

Out[11]: array([ 0., 1., 2., nan, 4., inf, -inf, inf])

 

In [12]: np.isposinf(a)

Out[12]: array([False, False, False, False, False, True, False, True], dtype=bool)

 

 

 

 

  (1-6-2) 참 확인 논리 함수 (Logic functions for truth value testing)

 

  (1-6-2-1) 배열의 모든 원소가 참(True) 인지 평가하는 함수 : np.all()

 

축(no axis, axis=0, axis=1) 에 따라서 어떻게 참(True) 여부를 평가하는지 유심히 보시기 바랍니다.

 

 

# np.all() : Test whether all array elements along a given axis evaluate to True

 

In [13]: np.all([[True,False],[True,True]])

Out[13]: False


In [14]: np.all([[True,False],[True,True]], axis=0)

Out[14]: array([ True, False], dtype=bool)

 

In [15]: np.all([[True,False],[True,True]], axis=1)

Out[15]: array([False, True], dtype=bool)

 

 

 

 

  (1-6-2-2) 배열의 1개 이상의 원소가 참(True) 인지 평가하는 함수 : np.any()

 

 

# np.any() : Test whether any array elements along a given axis evaluate to True

 

In [16]: np.any([[True,False],[True,True]])

Out[16]: True


In [17]: np.any([[True,False],[True,True]], axis=0)

Out[17]: array([ True, True], dtype=bool)


In [18]: np.any([[True,False],[True,True]], axis=1)

Out[18]: array([ True, True], dtype=bool)

 


 

In [21]: np.any([[False,False],[True,True]], axis=0)

Out[21]: array([ True, True], dtype=bool)

 

In [22]: np.any([[False,False],[True,True]], axis=1)

Out[22]: array([False, True], dtype=bool)

 

 

 

 

  (1-6-3) 단일 배열 원소에 대한 논리 연산(Logical operations)을 위한 논리 함수

 

  (1-6-3-1) 배열 원소가 조건을 만족하지 않는 경우 참 반환 : np.logical_not(condition)

 

 

# logical_not : Compute the truth value of NOT x element-wise, equivalent to -x

 

In [23]: b = np.array([0, 1, 2, 3, 4])


In [24]: np.logical_not( b <= 2 )

Out[24]: array([False, False, False, True, True], dtype=bool)

 

 

 

2개 배열 간 함수인 Binary Universal Unfctions(Ufuncs) 소개는 http://rfriend.tistory.com/286 를 참고하시기 바랍니다.

 

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

 

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

이전 포스팅에서는

 

 - 범용함수(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 function, ufuncs)의 정의 및 유형

 

 

(1) 1개의 배열에 대한 ufuncs (Unary universal functions) 중에서

 

 - (1-1) 올림 및 내림 범용 함수 (rounding ufuncs)

 - (1-2) 합(sums), 곱(products), 차분(difference), 기울기(gradient) 범용함수

 

들에 대해서 알아보았습니다.

 

이번 포스팅에서는 Unary ufuncs 중에서

 

 - (1-3) 지수함수(exponential function), 로그함수 (logarithmic function)

 

에 대해서 알아보겠습니다.

 

 

고등학교 때 지수함수, 로그함수에 대해서 배웠을 텐데요, 기억이 가물가물 하신분들을 위해서 간단히 지수함수, 로그함수에 대해서 먼저 복기를 해본 후에 Python NumPy 의 지수함수, 로그함수 사용법으로 넘어가겠습니다.

 

 

지수함수(exponential function)는 아래 왼쪽의 그래프처럼 인 형태의 함수를 말합니다.  아래 [그림1] 왼쪽의 지수함수 예시 그래프는   지수함수의 그래프로서, (x=0, y=1), (x=1, y=2) 지점을 지나고 있습니다.

 

로그함수(logarithmic function)는 지수함수의 역함수(inverse function) 입니다. 즉, 아래 [그림1] 그래프의 예를 들자면원래 지수함수였던 의 역함수는  함수인데요, 이를 표기하기 편하도록 라고 하자고 약속을 한 것입니다. (밑이 '2'인 로그함수)

 

 

[그림1] 지수함수와 로그함수의 관계 및 그래프 예시

 

 

 

 

특히, 자연상수 e 를 밑으로 하는 로그함수를 자연로그(natural logarithm) 하며, 처럼 쓰기 보다는 보통 자연상수 e를 생략하고 그냥 혹은 로 쓰곤 합니다. 아래 [그림2] 그래프를 참고하세요.

 

(참고로, 자연상수 e2.71828182846... 의 값을 가지는 무리수이며, 수학자의 이름을 따서 '오일러의 수(Euler's number)' 또는 '네이피어의 수(Napier's number)'라고도 함)

 

 

[그림2] 밑(base)이 자연상수 e 인 지수함수와 자연로그 함수 그래프

 

 

 

 

간단한 복기는 여기까지 하고요, 이제 Python NumPy의 지수함수, 로그함수에 대해 알아보겠습니다.

별것 없구요, 간단합니다. ^^'

 

  (1-3-1) 지수함수 (exponential function) : np.exp()

 

NumPy의 np.exp() 함수는 밑(base)이 자연상수 e 인 지수함수  로 변환해줍니다.

 

 

In [1]: import numpy as np


In [2]: x = np.array([0.00001, 1, 2, 4, 10, 100])


In [3]: x

Out[3]:

array([  1.00000000e-05,   1.00000000e+00,   2.00000000e+00,
          4.00000000e+00,   1.00000000e+01,   1.00000000e+02])


In [4]: np.exp(x)

Out[4]:

array([  1.00001000e+00,   2.71828183e+00,   7.38905610e+00,
          5.45981500e+01,   2.20264658e+04,   2.68811714e+43])

 

 

 

 

 (1-3-2) 로그함수 (logarithmic function) : np.log(x), np.log10(x), np.log2(x), log1p(z) 

 

지수함수의 역함수인 로그함수는 밑이 자연상수 e, 혹은 10, 또는 2 이냐에 따라서 np.log(x), np.log10(x), np.log2(x) 를 구분해서 사용합니다.

 

 

# natural logarithm (base e)

 

In [5]: np.log(x)

Out[5]:

array([-11.51292546,   0.        ,   0.69314718,   1.38629436,
           2.30258509,   4.60517019])

 

 

# log base 10

In [6]: np.log10(x)

Out[6]: array([-5.        ,  0.        ,  0.30103   ,  0.60205999,  1.        ,  2.        ])

 

 

# log base 2

In [7]: np.log2(x)

Out[7]:

array([-16.60964047,   0.        ,   1.        ,   2.        ,
           3.32192809,   6.64385619])

 

 

 

 

로그함수의 경우 위의 [그림2]의 하단에 있는 자연로그 함수 그래프를 보면 알겠지만, x=0 인 경우 y가 -무한대(-infinite)의 값을 가집니다.  아래의 Out[9]번에 보면 NumPy 에 '0'이 포함된 배열을 np.log() 함수에 대입하면 'RuntimeWarning: divide by zero encountered in log' 라는 경고메시지가 뜨고, -inf 가 포함된 배열을 반환하게 됩니다. 이럴 때 사용하는 방법이 'x+1'을 해줘서 '0' -> '1' 로 바꿔주는 겁니다. np.log1p() 함수가 바로 이 역할을 해주는 함수입니다. 그러면 y값이 '-inf' -> '0'으로 바뀌게 되죠.

 

 

In [8]: z = np.array([0, 1.71828])


In [9]: np.log(z)

C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\start_ipython_kernel.py:1: RuntimeWarning: divide by zero encountered in log

# -*- coding: utf-8 -*-

Out[9]: array([ -inf, 0.54132379])

 

 

# log(1+z) = np.log1p(z)

In [10]: np.log1p(z)

Out[10]: array([ 0. , 0.99999933])

 

 

 

 

물론 np.log1p() 함수를 안쓰고 그냥 np.log() 함수를 써서 아래처럼 np.log(1+z) 라고 해도 똑같은 결과를 얻을 수 있습니다.

 

 

In [11]: np.log(1+z)

Out[11]: array([ 0. , 0.99999933])

 

 

 

 

그럼, 지수함수, 로그함수는 어디에 써먹는 건가 궁금할 것 같습니다.

한가지 예를 들자면 오른쪽으로 심하게 skewed된 멱함수(power law function) 분포를 띠는 데이터를 정규분포(normal distribution) 로 변환할 때 로그 변환 (log transformation)을 사용하곤 합니다.

 

자세한 내용은 오른쪽 포스팅 참고하세요.  ☞  http://rfriend.tistory.com/53

 

 

여기서 끝내기 조금 아쉬우니 지수함수와 로그함수의 성질(properties of exponential and logarithmic function)도 복기해보겠습니다. 논문 읽다보면 지수함수와 로그함수의 성질을 알아야지 이해가 되는 공식 전개가 가끔씩 나오니 기억해두면 좋겠지요?!  증명은 생략합니다. ^^'

 

 

 

다음번 포스팅에서는 Unary ufuncs 의 네번째로 삼각함수(trigonometric functions)를 알아보겠습니다.

 

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

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 유효상 2018.05.31 17:40  댓글주소  수정/삭제  댓글쓰기

    정말 많은 도움 되었습니다. 정말 감사합니다