Studio KimHippo :D

[Python / NumPy] 5. NumPy ufunction 본문

Python Study/NumPy

[Python / NumPy] 5. NumPy ufunction

김작은하마 2019. 7. 8. 00:25
from scipy import special
import numpy as np

# NOTE
# NumPy의 배열 연산은 아주 빠르거나 아주 느릴수 있는데, 이 연산을 빠르게 만드는 핵심은 바로 벡터화연산을 사용하는 것이다.
# 그것은 일반적으로 NumPy의 Universal Functions(ufuncs)를 통해 구현된다.

# NOTE : UFuncs에는 단일 입력값에 동작하는 단항 ufuncs, 두 개의 입력값에 동작하는 이항 ufuncs가 있다. 
x = np.arange(4)

# NOTE : 배열 산술연산
print("x    = ", x)
print("x+5  = ", x + 5)
print("x-5  = ", x - 5)
print("x*2  = ", x * 2)
print("x/2  = ", x / 2)
print("x//2 = ", x // 2) # NOTE : 바닥 나눗셈(나머지는 버림)
print("-x   = ", -x)
print("x^2  = ", x**2)
print("x%2  = ", x % 2) 

Out [1] :

x    =  [0 1 2 3]

x+5  =  [5 6 7 8]
x-5  =  [-5 -4 -3 -2]
x*2  =  [0 2 4 6]
x/2  =  [0.  0.5 1.  1.5]
x//2 =  [0 0 1 1]
-x   =  [ 0 -1 -2 -3]
x^2  =  [0 1 4 9]
x%2  =  [0 1 0 1]

print("x   = ", x)
print("x+5 = ", np.add(x, 5))
print("x-5 = ", np.subtract(x, 5))
print("x*2 = ", np.multiply(x, 2))
print("x/2 = ", np.divide(x, 2))
print("x//2 = ", np.floor_divide(x, 2))
print("-x  = ", -x)
print("x^2 = ", np.power(x, 2))
print("x%2 = ", np.mod(x, 2)) 

Out [1] :

x   =  [0 1 2 3]
x+5 =  [5 6 7 8]
x-5 =  [-5 -4 -3 -2]
x*2 =  [0 2 4 6]
x/2 =  [0.  0.5 1.  1.5]
x//2 =  [0 0 1 1]
-x  =  [ 0 -1 -2 -3]
x^2 =  [0 1 4 9]
x%2 =  [0 1 0 1]

# NOTE : 절댓값 함수
x = np.array([-2, -1, 0, 1, 2])
y = np.array([3-4j, 4-3j, 2+0j, 0+1j])

print(abs(x))
print(np.abs(x))
print(np.absolute(x))

print(abs(y))
print(np.abs(y))
print(np.absolute(y)) 

Out [1] :

[2 1 0 1 2]
[2 1 0 1 2]
[2 1 0 1 2]
[5. 5. 2. 1.]
[5. 5. 2. 1.]
[5. 5. 2. 1.]

# NOTE : 삼각함수
theta = np.linspace(0, np.pi, 3) # NOTE : 0부터 pi까지 균등하게 3개의 원소로 구성된 배열을 만듦.
print("theta   = ", theta)
print("sin(theta)  = ", np.sin(theta))
print("cos(theta)  = ", np.cos(theta))
print("tan(theta   = ", np.tan(theta))
print('\n')

x = [-1, 0, 1]
print("x   = ", x)
print("arcsin(x)   = ", np.arcsin(x))
print("arccos(x)   = ", np.arccos(x))
print("arctan(x)   = ", np.arctan(x)) 

Out [1] :

theta   =  [0.         1.57079633 3.14159265]
sin(theta)  =  [0.0000000e+00 1.0000000e+00 1.2246468e-16]
cos(theta)  =  [ 1.000000e+00  6.123234e-17 -1.000000e+00]
tan(theta   =  [ 0.00000000e+00  1.63312394e+16 -1.22464680e-16]

 

x   =  [-1, 0, 1]
arcsin(x)   =  [-1.57079633  0.          1.57079633]
arccos(x)   =  [3.14159265 1.57079633 0.        ]
arctan(x)   =  [-0.78539816  0.          0.78539816]

# NOTE : 지수와 로그함수
x = [1, 2, 3]
print("x   = ", x)
print("e^x = ", np.exp(x))
print("2^x = ", np.exp2(x))
print("3^x = ", np.power(3,x))
print('\n')

x = [1, 2, 4, 10]
print("x   = ", x)
print("ln(x)    = ", np.log(x))
print("log2(x)  = ", np.log2(x))
print("log10(x) = ", np.log10(x))
print('\n')

# NOTE : 매우 작은 입력값의 정확도 유지
x = [0, 0.001, 0.01, 0.1]
print('exp(x) - 1    = ', np.expm1(x))
print('log(x + 1)    = ', np.log1p(x)) 

Out [1] :

x   =  [1, 2, 3]
e^x =  [ 2.71828183  7.3890561  20.08553692]
2^x =  [2. 4. 8.]
3^x =  [ 3  9 27]


x   =  [1, 2, 4, 10]
ln(x)   =  [0.         0.69314718 1.38629436 2.30258509]
log2(x)  =  [0.         1.         2.         3.32192809]
log10(x) =  [0.         0.30103    0.60205999 1.        ]


exp(x) - 1    =  [0.         0.0010005  0.01005017 0.10517092]
log(x + 1)    =  [0.         0.0009995  0.00995033 0.09531018]

# NOTE : 감마 함수(일반화된 계승)와 관련 함수
x = [1, 5, 10]
print('gamma(x)   = ', special.gamma(x))
print('ln|gamma(x)|  = ', special.gammaln(x))
print('beta(x)    = ', special.beta(x, 2)) 

# NOTE : 오차 함수(가우스 적분), 그 보수(complement)와 역수(inverse)
x = np.array([0, 0.3, 0.7, 1.0])
print('erf(x)   = ', special.erf(x))
print('erfc(x)  = ', special.erfc(x))
print('erfinv(x)  = ', special.erfinv(x)) 

Out [1] :

gamma(x)   =  [1.0000e+00 2.4000e+01 3.6288e+05]
ln|gamma(x)|  =  [ 0.          3.17805383 12.80182748]
beta(x)    =  [0.5        0.03333333 0.00909091]

 

# NOTE : 오차 함수(가우스 적분), 그 보수(complement)와 역수(inverse)
x = np.array([0, 0.3, 0.7, 1.0])
print('erf(x)   = ', special.erf(x))
print('erfc(x)  = ', special.erfc(x))
print('erfinv(x)  = ', special.erfinv(x)) 

x = np.arange(5)
y = np.empty(5)
np.multiply(x, 10, out = y)
print(y) 

y = np.zeros(10)
np.power(2, x, out = y[::2])
print(y)

Out [1] :

erf(x)   =  [0.         0.32862676 0.67780119 0.84270079]
erfc(x)  =  [1.         0.67137324 0.32219881 0.15729921]
erfinv(x)  =  [0.         0.27246271 0.73286908        inf]

 

Out [2] :

[ 0. 10. 20. 30. 40.]

 

Out [3] :

[ 1.  0.  2.  0.  4.  0.  8.  0. 16.  0.]

# NOTE : 객체로부터 직접 연산할 수 있는 집계 함수

x = np.arange(1, 6) 
print(np.add.reduce(x)) # NOTE : 배열의 모든 요소의 합 반환
print(np.multiply.reduce(x)) # NOTE : 배열의 모든 요소의 곱 반환


print(np.add.accumulate(x)) # NOTE : 계산의 중간 결과를 모두 저장
print(np.multiply.accumulate(x))

Out [1] :

15

120

[ 1  3  6 10 15]

[  1   2   6  24 120]

# NOTE : 외적(Outer products)
x = np.arange(1, 6)
np.multiply.outer(x, x) 

# NOTE : 배열의 값의 합 구하기
L = np.random.random(100)
print(np.add.reduce(L))
print(np.sum(L))
sum(L)

# NOTE
# 큰 배열에서의 sum메소드와 NumPy ufunction 배열 합 동작시간 비교
big_array = np.random.rand(1000000)
%timeit sum(big_array)
%timeit np.sum(big_array)

# NOTE : 최댓값과 최솟값
min(big_array), max(big_array)
np.min(big_array), np.max(big_array)

# NOTE
# 큰 배열에서의 min메소드와 NumPy ufunction 배열 최소값 탐색 동작시간 비교
%timeit min(big_array)
%timeit np.min(big_array)

print(big_array.min(), big_array.max(), big_array.sum())

Out [1] : [1 2 3 4 5]

Out [2] : array([[ 1,  2,  3,  4,  5],  [ 2,  4,  6,  8, 10], [ 3,  6,  9, 12, 15], [ 4,  8, 12, 16, 20], [ 5, 10, 15, 20, 25]])

Out [3] : 46.418479610165775 46.418479610165775

Out [4] :

64.8 ms ± 686 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

506 µs ± 10.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

 

Out [5] :

49.4 ms ± 617 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

507 µs ± 3.42 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

 

Out [6] :

5.350358511790887e-08 0.9999993071763015 500265.77728857764

NumPy 집계함수

np.sum, np.nansum(NaN안전모드) : 요소의 합 계산
np.prod, np.nanprod(NaN안전모드) : 요소의 곱 계산
np.mean, np.nanmean((NaN안전모드) : 요소의 평균 계산
np.std, np.nanstd(NaN안전모드) : 요소의 표준편차 계산
np.var, np.nanvar(NaN안전모드) : 요소의 분산 게산
np.min, np.nanmin(NaN안전모드) : 최솟값 계산
np.max, np.nanmax(NaN안전모드) : 최댓값 계산
np.argmin, np.nanargmin(NaN안전모드) : 최솟값의 인덱스 찾기
np.argmax, np.nanargmax(NaN안전모드) : 최댓값의 인덱스 찾기
np.median, np.nanmedian(NaN안전모드) : 요소의 중앙값 계산
np.percentile, np.nanpercentile(NaN안전모드) : 요소의 순위 기반 백분위 수 계산
np.any : 요소 중 참이 있는지 검사
np.all : 모든 요소가 참인지 검사

 

# NOTE : (열) axis = 0, (행) axis = 1
print(M.min(axis=0))
print(M.min(axis=1))

# NOTE : 비교연산자와 대응 ufunc
# == : np.equal
# != : np.not_equal
# < : np.less
# <= : np.less_equal
# > : np.greater
# >= : np.greater_equal 

rng = np.random.RandomState(0)
x = np.random.randint(10, size = (3, 4))

print(np.equal(x, 1))
print(np.not_equal(x, 1))
print(np.less(x, 5))
print(np.less_equal(x, 5))
print(np.greater(x, 5))
print(np.greater_equal(x, 5))

print(np.count_nonzero(np.less(x, 6)))
print(np.sum(np.less(x, 6)))
print(np.sum(np.less(x, 6), axis = 1)) # NOTE : 각 행에 6보다 작은 값의 갯수
print(np.sum(np.less(x ,6), axis = 0)) # NOTE : 각 열에 6보다 작은 값의 갯수

print(np.any(np.greater(x, 8))) # NOTE : 8보다 큰 수가 있는가?
print(np.all(np.less(x, 10))) # NOTE : 모든 값이 10보다 작은가?
print(np.all(np.less(x, 8), axis = 1)) # NOTE : 각 행의 모든 값이 8보다 작은가?

# NOTE : bool 연산자와 대응 ufunc
# & : np.bitwise_and
# | : np.bitwise_or
# ^ : np.bitwise_xor
# ~ : np.bitwise_not

# NOTE : 마스킹 연산
# 마스킹 연산 : 배열에서 조건에 맞는 값들을 선택

x[x < 5]
# output : array([4, 1, 2, 2, 1, 3])
# NOTE : 마스크 배열이 True인 위치에 있는 모든 값으로 채워짐.

Out [1] : 

[0.19206812 0.17953433 0.0780352  0.29737519]

[0.15878582 0.19536175 0.0780352 ]

 

Out [2] :

[[False False  True False] [False False False False] [False  True False False]]


[[ True  True False  True] [ True  True  True  True] [ True False  True  True]]

 

[[ True False  True False] [False False  True False] [ True  True False  True]]

 

[[ True False  True  True] [False False  True False] [ True  True False  True]]

 

[[False  True False False] [ True  True False  True] [False False  True False]]

 

[[False  True False  True] [ True  True False  True] [False False  True False]]

 

Out [3] :

7
7
[3 1 3]
[2 1 2 2]

 

Out [4] : 

True
True [ True False  True]

 

Out [5] :

array([4, 1, 2, 2, 1, 3])

 

 

참고

O'REILLY 제이크 밴더플래스 저/ 위키북스 김정인 역 - 파이썬 데이터 사이언스 핸드북

Comments