period = [2.4, 5, 6.3, 4.1]
print(60 * period)
bh_mass = [4.3, 5.8, 9.5, 7.6]
MASS_SUN = 1.99 * 10 ** 30
print(MASS_SUN * bh_mass)

time = list(range(1,10, 0.1))

"""
Explanation: Python 基本語法與科學計算套件的使用： Python科學計算套件(一)
四堂課程大綱

第一堂-Python 基礎(一)：Python 簡介及環境建立、Python程式的編寫及執行、資料型態、基本輸入輸出、流程控制
第二堂-Python 基礎(二)：檔案讀寫、例外處理、函數、模組、物件導向
第三堂-Python科學計算套件(一)：Numpy、Matplotlib 
第四堂-Python科學計算套件(二)：Scipy、Astropy

Numpy

Python 內建的list資料結構不適合數值運算
Python 內建的range()函數無法以浮點數來設定序列間距
End of explanation
"""


import numpy as np

"""
Explanation: 引入Numpy 套件
End of explanation
"""


period = np.array([2.4, 5, 6.3, 4.1])
print(60 * period)
bh_mass = np.array([4.3, 5.8, 9.5, 7.6])
MASS_SUN = 1.99 * 10 ** 30
print(MASS_SUN * bh_mass)

time = np.arange(1, 10, 0.1)
time2 = np.linspace(1, 10, 5)
init_value = np.zeros(10)
init_value2= np.ones(10)
print(time)
print(time2)
print(init_value)
print(init_value2)

"""
Explanation: 建立Numpy陣列
End of explanation
"""


period2 = np.array([[2.4, 5, 6.3, 4.1], [4.2, 5.3, 1.2, 7.1]])
print(period2.ndim)
print(period2.shape)
print(period2.dtype)

"""
Explanation: Numpy陣列的屬性
End of explanation
"""


print(period2[0])
print(period2[1][1:-1])

print(np.sort(period2[0]))
print(np.argsort(period2[0]))
print(np.argmax(period2[0]))
print(np.where(period2[0] > 4.5))
print(np.extract(period2[0] > 4.5, period2[0]))

counts = 100 * np.sin(2 * np.pi * 1. / period2[0][1] * time) + 500
print(counts)

"""
Explanation: Numpy陣列的操作
End of explanation
"""


import numpy.random as npr
print(npr.rand(5))
print(npr.randn(10))
print(npr.normal(5., 1., 10))

"""
Explanation: 亂數產生
End of explanation
"""


lc = np.array([time, counts])
np.savetxt('test.out', lc)
input_time, input_counts = np.loadtxt('test.out')

print(input_time)
print(input_counts)

"""
Explanation: 檔案輸出輸入
End of explanation
"""


import matplotlib.pyplot as plt
%matplotlib inline

"""
Explanation: Matplotlib

引入Matplotlib 套件
End of explanation
"""


plt.plot(input_time, input_counts)
plt.xlabel('Time')
plt.ylabel('Counts')
plt.title('Light curve', fontsize=18)
plt.axis([1, 15, 350, 700])
plt.xticks([1, 5, 10])
plt.yticks([350, 500, 700])
#plt.show()  # 開啟圖片編輯視窗，並將圖顯示在該視窗中，透過該視窗可修改圖片、存檔

#plt.hold(True) # 保留目前的圖，以便重疊繪圖
plt.plot(input_time, input_counts-100, marker='o', color='green', linewidth=1)

plt.plot(input_time, input_counts+100, 'r*')
#plt.legend(('lc1', 'lc2', 'lc3'))
#plt.hold(False)

"""
Explanation: 基本樣式控制及文字標示
End of explanation
"""


plt.subplot(211)
plt.plot(input_time, input_counts)
plt.subplot(212)
plt.plot(input_time, input_counts, '.m')
#plt.savefig('subplot.png')

"""
Explanation: 把多張圖合併成一張圖
End of explanation
"""


y_errors = 10 * npr.rand(len(input_time)) + 5
plt.plot(input_time, input_counts, 'k.')
plt.errorbar(input_time, input_counts, yerr=y_errors, fmt='r')

"""
Explanation: 畫error bar
End of explanation
"""


