numpy 與 matplotlib 的應用 一、庫函數介紹 1. numpy庫 NumPy(Numeric Python)提供了一個N維的數組類型ndarray,Numpy底層使用C語言編寫,內部解除了GIL(全局解釋器鎖),其對數組的操作速度不受Python解釋器的限制,效率遠高於純Python ...
numpy 與 matplotlib 的應用
一、庫函數介紹
1. numpy庫
NumPy(Numeric Python)提供了一個N維的數組類型ndarray,Numpy底層使用C語言編寫,內部解除了GIL(全局解釋器鎖),其對數組的操作速度不受Python解釋器的限制,效率遠高於純Python代碼。
ndarray到底跟原生python列表的區別:
ndarray中的所有元素的類型都是相同的,而Python列表中的元素類型是任意的,所以ndarray在存儲元素時記憶體可以連續,而python原生list就只能通過定址方式找到下一個元素,這雖然也導致了在通用性能方面Numpy的ndarray不及Python原生list,但在科學計算中,Numpy的ndarray就可以省掉很多迴圈語句,代碼使用方面比Python原生list簡單的多。
2. matplotlib庫
matplotlib 是一個 Python 的 2D繪圖庫,也是Python編程語言及其數值數學擴展包 NumPy的可視化操作界面。它利用通用的圖形用戶界面工具包,如Tkinter, wxPython, Qt或GTK+嚮應用程式嵌入式繪圖提供了應用程式介面(API)。此外,matplotlib還有一個基於圖像處理庫(如開放圖形庫OpenGL)的pylab介面,其設計與MATLAB非常類似--儘管並不怎麼好用。SciPy就是用matplotlib進行圖形繪製。
二、應用A
1. 介紹:對python123作業的成績通過畫圖顯示
2. 代碼實現:
1 # -*- coding:utf-8 -*- 2 ''' 成績雷達圖 ''' 3 import numpy as np 4 import matplotlib.pyplot as plt 5 plt.rcParams['font.family'] = 'SimHei' # 設置字體 6 plt.rcParams['font.sans-serif'] = ['SimHei'] # 設置字體 7 8 labels = np.array(['第一周','第二周','第三周','第四周','第五周','第六周']) # 設置標簽 9 datas = np.array([8, 10, 9, 10, 11, 7]) # 設置數據 10 angles = np.linspace(0, 2*np.pi, 6, endpoint = False) # 設置角度 11 datas = np.concatenate((datas, [datas[0]])) 12 angles = np.concatenate((angles, [angles[0]])) 13 fig = plt.figure(facecolor = 'white') # 創建繪圖區域 14 plt.subplot(111, polar = True) # 極坐標 15 plt.plot(angles, datas, 'bo-', color = 'g', linewidth = 1) # 畫圖 16 plt.fill(angles, datas, facecolor = 'g', alpha = 0.25) # 填充 17 plt.thetagrids(angles*180/np.pi, labels) # 設置極坐標的位置 18 plt.figtext(0.52, 0.95, '04-步平凡', ha = 'center') # 設置標題 19 plt.grid(True) # 打開網格線 20 plt.show() # 展示圖片
3. 效果展示:
三、應用B
1. 介紹:使用numpy和PIL庫實現圖像的手繪效果
2. 代碼實現:
1 # -*- coding:utf-8 -*- 2 ''' 手繪圖像效果 ''' 3 import numpy as np 4 from PIL import Image 5 vec_el = np.pi/2.2 # 光源的俯視角度,弧度值 6 vec_az = np.pi/4. # 光源的方位角度,弧度值 7 depth = 6. # 深度權值,值越小背景區域越接近白色,值越大背景區域越接近黑色 8 im = Image.open('PICTURE\HandMade.jpg').convert('L') # 打開圖像並轉變為灰度模式 9 a = np.asarray(im).astype('float') 10 grad = np.gradient(a) # 取圖像灰度的梯度值 11 grad_x, grad_y = grad # 分別取圖像的橫縱梯度值 12 grad_x = grad_x * depth / 100. 13 grad_y = grad_y * depth / 100. 14 dx = np.cos(vec_el) * np.cos(vec_az) # 光源對x軸的影響 15 dy = np.cos(vec_el) * np.sin(vec_az) # 光源對y軸的影響 16 dz = np.sin(vec_el) # 光源對z軸的影響 17 A = np.sqrt(grad_x**2 + grad_y**2 + 1.) 18 uni_x = grad_x/A 19 uni_y = grad_y/A 20 uni_z = 1./A 21 a2 = 255*(dx * uni_x + dy * uni_y + dz * uni_z) # 光源歸一化 22 a2 = a2.clip(0, 255) # 預防溢出 23 im2 = Image.fromarray(a2.astype('uint8')) # 重構圖像 24 im2.save('HandMade_.jpg') # 保存圖像 25 im2.show() # 顯示圖像
3. 效果展示:
原圖 效果圖
四、應用C
1. 簡介:用numpy和matplotlib展現數學模型 —— 正態分佈
2. 代碼實現:
1 # -*- coding:utf-8 -*- 2 ''' 正態分佈 ''' 3 import numpy as np 4 import matplotlib.mlab as mlab 5 import matplotlib.pyplot as plt 6 7 dx = 100 # 正態分佈的均值 8 sigma = 15 # 標準差 9 x = dx + sigma * np.random.randn(10000) # 在均值周圍產生符合正態分佈的x值 10 11 num_bins = 50 12 n, bins, patches = plt.hist(x, num_bins, normed=1, facecolor='green', alpha=0.5) 13 # 直方圖函數,x為x軸的值,normed=1表示為概率密度,即和為一,綠色方塊,色深參數0.5.返回n個概率,直方塊左邊線的x值,及各個方塊對象 14 y = mlab.normpdf(bins, dx, sigma) # 畫一條逼近的曲線 15 plt.plot(bins, y, 'r--') 16 plt.xlabel('Smarts') # x軸標簽 17 plt.ylabel('Probability') # y軸標簽 18 plt.title(r'Histogram of IQ: $\mu=100$, $\sigma=15$') # 中文標題 19 20 plt.subplots_adjust(left=0.15) # 左邊距 21 plt.grid(True) # 打開網格線 22 plt.show() # 顯示圖片
3. 效果展示: