Chapter3 Mathematical Functions: Notebook5 Handling Complex Numbers
우리가 Engineering 분야에 대한 분석을 하면 빠질 수 없는 것이 Complex number들이다. 그리고 NumPy에서는 image number를 j로 표시한다.
Engineering 분야에서 특히 전자공학에서 i대신 j를 쓰는 이유는 저자가 생각하기에 i는 current라는 매우 중요한 측정치가 사용하고 있기 때문에 하나 밀려나서 j라고 사용하는 것 같고, NumPy도 이 j를 사용하고 있다.
이 Complex number를 더 편리하게 사용하기 위해 다음과 같은 method들을 배워보도록 하자.
1. np.real()
2. np.imag()
3. np.angle()
4. np.conj()
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
Making ndarray with Complex Numbers¶
NumPy에서 imaginary number는 j로 표시한다고 했으므로 다음과 같이 ndarray를 만들어낼 수 있다.
test_np = np.array([1+1j, 1-1j, 3+2j, 5-2j])
print(test_np)
이때 중요한 점은 1*j라고 하더라도 j라고만 쓰면 NumPy는 j를 variable로 인식하기 때문에 1j로 써줘야 한다.
그리고 j도 하나의 scalar이기 때문에 다음과 같이 ndarray를 만드는 것도 가능하다.
real_np = np.arange(10)
imag_np = np.arange(10)[::-1]*1j
cpx_np = real_np + imag_np
print("real_np:", real_np)
print("imag_np:", imag_np)
print("cpx_np:", cpx_np)
np.real(), np.imag()¶
이름에서 알 수 있듯이 np.real(), np.imag()는 각 complex number의 real part, imaginary part를 뽑아주는 역할을 한다.
print("cpx_np:", cpx_np)
print("np.real(cpx_np):", np.real(cpx_np))
print("np.imag(cpx_np):", np.imag(cpx_np))
또한 np의 method 말고 ndarray의 method들로도 다음과 같이 이용할 수 있다.
print("cpx_np:", cpx_np)
print("cpx_np.real:", cpx_np.real)
print("cpx_np.imag:", cpx_np.imag)
np.angle()¶
np.angle()을 사용하기 위해 다음과 같이 complex unit circle을 만들어보자.
다음은 Euler's Formula를 이용한다.
$e^{j\theta} = cos(\theta) + jsin(\theta)$
radian_range = np.linspace(0, 2*np.pi)
cpx_circle = np.cos(radian_range) + np.sin(radian_range)*1j
그리고 real, imag를 뽑아내서 결과를 확인해보자.
real_part = cpx_circle.real
imag_part = cpx_circle.imag
fig, ax = plt.subplots(figsize = (7,7))
ax.scatter(real_part, imag_part)
complex unit circle이 잘 만들어진 것 같으니 cpx_circle를 확인해보자.
print(cpx_circle)
이제 위의 complex number들에 대해 np.angle()을 적용해보면 다음과 같다.
angle_np = np.angle(cpx_circle)
plt.figure(figsize = (10,4))
plt.grid()
plt.plot(angle_np)
즉, 0부터 PI까지 제대로 나오는 것을 확인할 수 있다. 그리고, angle은 -PI부터 PI까지만 다루므로 PI를 넘어가면 -2PI의 offset 걸어 radian boundary안에 들어가도록 수정해주는 모습 또한 볼 수 있다.
np.conj()¶
complex conjugate은 angle의 부호를 바꿔주는 역할을 한다. 그러면 위의 결과에서 npconj()을 사용하여 부호를 바꿔주는지 확인해보자.
angle_np = np.angle(cpx_circle)
angle_conj_np = np.angle(np.conj(cpx_circle))
plt.figure(figsize = (10,4))
plt.grid()
plt.plot(angle_np, label = 'angle_np')
plt.plot(angle_conj_np, label = 'angle_conj_np')
plt.legend()
위와 같이 절대값은 바뀌지 않고, angle의 부호만 바뀌는 것을 확인할 수 있다.