Numpy(Numerical Python)是Python中一個非常常用的第三方科學計算庫。Numpy提供了python對多維數組對象的支持:ndarray,具有矢量運算能力,快速、節省空間。numpy支持高級大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
Matplotlib(數據可視化)是Python中一個能夠提供數據繪圖功能的第三方庫。其pyplot 子庫主要用於實現各種數據展示圖形的繪制,包括線性圖(折線圖,函數圖)、柱形圖、餅圖等基礎而直觀的圖形,在平常的開發當中需要繪圖時就非常有用了。
引用方式:
1 import numpy as np 2 import matplotlib.pyplot as plt 3 #以下三行代碼是為了正確顯示中文字體,更改了默認設置,'SimHei'表示黑體字。 4 import matplotlib 5 matplotlib.rcParams['font.family'] = 'SimHei' 6 matplotlib.rcParams['font.sans-serif'] = ['SimHei']
as 保留字與import 一起使用能夠改變后續代碼中庫的命名空間,有助於提高代碼可讀性。簡單說,在后續程序中,np 代替numpy,plt 將代替matplotlib.pyplot。
一、Numpy
使用Numpy庫,可以執行以下操作:
- 數組的算數和邏輯運算。
- 傅立葉變換和用於圖形操作的例程。
- 與線性代數有關的操作。 NumPy 擁有線性代數和隨機數生成的內置函數。
- Ndarray對象
numpy 庫處理的最基礎數據類型是由同種元素構成的多維數組(ndarray),簡稱“數組”。數組中所有元素的類型必須相同,數組中元素可以用整數索引,序號從0開始。ndarray 類型的維度(dimensions)叫做軸(axes),軸的個數叫做秩(rank)。一維數組的秩為1,二維數組的秩為2,二維數組相當於由兩個一維數組構成。
常用的創建數組函數如下:
創建了數組后,ndarray類型有一些基本屬性:
代碼示例:
>>> import numpy as np
>>> a = np.ones((3,3))
>>> print(a)
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
>>> a.ndim
2
>>> a.shape
(3, 3)
>>> a.dtype
dtype('float64')
ndarray類的形態操作方法:
ndarray類的索引和切片:
與列表的相同,不過需要注意的是數組切片得到的是原始數組的視圖,所有修改都會直接反映到源數組。如果需要得到的ndarray 切片的一份副本,需要進行復制操作,比如 arange[5:8].copy()。
- Numpy庫的運算函數
這些函數中,輸出參數y可選,如果沒有指定,將創建並返回一個新的數組保存計算結果;如果指定參數,則將結果保存到參數中。例如,兩個數組相加可以簡單地寫為a+b,而np.add(a, b, a)則表示a+=b。
- where()函數是三元表達式x if condition else y 的矢量版本。
- 這些函數將返回一個布爾數組,它包含兩個數組中對應元素值的比較結果,如下:
>>> np.less([1, 2],[2,2]) array([ True, False], dtype=bool)
其他運算函數:
二、Matplotlib
- Matplotlib.pyplot 庫(plt 子庫提供了一批操作和繪圖函數,每個函數代表對圖像進行的一個操作,比如創建繪圖區域、添加標注或者修改坐標軸等)
plt庫的繪圖區域函數:
- 使用figure()函數創建一個全局繪圖區域,並且使它成為當前的繪圖對象,figsize參數可以指定繪圖區域的寬度和高度,單位為英寸。鑒於figure()函數參數較多,這里采用指定參數名稱的方式輸入參數。
>>> plt.figure(figsize = (8, 5))
- axes()默認創建一個subplot(111)坐標系,參數rec = [left,bottom,width,height]中四個變量的范圍都為[0,1],表示坐標系與全局繪圖區域的關系;axisbg 指背景色,默認為white。
>>> plt.axes([0.1, 0.1, 0.7, 0.3], axisbg = 'y')
>>> plt.show() - subplot()都用於在全局繪圖區域內創建子繪圖區域,其參數表示將全局繪圖區域分成nrows 行和ncols 列,並根據先行后列的計數方式在plot_number 位置生成一個坐標系,實例代碼如下,三個參數關系如下圖所示。其中,全局繪圖區域被風割成3x2 的網格,其中,在第4 個位置繪制了一個坐標系。
>>> plt.subplot(324)
>>> plt.show()
plt庫的讀取和顯示函數:
plt庫的基礎圖表函數:
- plot()函數是用於繪制直線的最基礎函數,調用方式很靈活,x 和y 可以是numpy計算出的數組,並用關鍵字參數指定各種屬性。其中,label 表示設置標簽並在圖例(legend)中顯示,color 表示曲線的顏色,linewidth 表示曲線的寬度。在字符串前后添加"$"符號,matplotlib 會使用其內置的latex 引擎繪制的數學公式。
示例:
- plt庫的坐標軸(plt 庫有兩個坐標體系;圖像坐標和數據坐標。圖像坐標將圖像所在區域左下角視為原點,將x 方向和y 方向長度設定為1。整體繪圖區域有一個圖像坐標,每個axes()和subplot()函數產生的子圖也有屬於自己的圖像坐標。axes()函數參數rect 指當前產生的子區域相對於整個繪圖區域的圖像坐標。數據坐標以當前繪圖區域的坐標軸為參考,顯示每個數據點的相對位置)
坐標軸設置函數:
>>> plt.plot([1, 2, 4], [1, 2, 3]) >>> plt.axis() #獲得當前坐標軸范圍 (1.0, 4.0, 1.0, 3.0) >>> plt.axis([0, 5, 0, 8]) #4個變量分別是[xmin, xmax, ymin, ymax]
標簽設置函數:
示例:
區域填充函數:
示例:
三、雷達圖繪制

1 import numpy as np 2 import matplotlib.pyplot as plt 3 import matplotlib 4 matplotlib.rcParams['font.family'] = 'SimHei' 5 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] 6 labels = np.array(['第一周','第二周','第三周','第四周','第五周','第六周']) 7 nAttr = 6 8 data = np.array([100, 98, 98, 100, 96, 94]) #成績值 9 angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False) 10 data = np.concatenate((data, [data[0]])) 11 angles = np.concatenate((angles, [angles[0]])) #這兩行代碼作用是進行數組的拼接 12 fig = plt.figure(facecolor="white") 13 plt.subplot(111, polar=True) 14 plt.plot(angles, data, 'bo-', color = 'g', linewidth = 2) 15 plt.fill(angles, data, facecolor = 'g', alpha = 0.25) 16 plt.thetagrids(angles*180 / np.pi, labels) 17 plt.figtext(0.52, 0.95, '小明的成績表', ha = 'center') 18 plt.grid(True) 19 plt.savefig('Grade.JPG') 20 plt.show()
效果如下:
四、自定義手繪風

1 from PIL import Image 2 import numpy as np 3 vec_el=np.pi/2.2 #光源的俯視角度,弧度值 4 vec_az=np.pi/4. #光源的方位角度,弧度值 5 depth=10. #(0-100) 6 im=Image.open("pic.jpg").convert('L') 7 a=np.asarray(im).astype('float') 8 grad=np.gradient(a) #取圖像灰度的梯度值 9 grad_x,grad_y=grad #分別取橫縱圖像梯度值 10 grad_x=grad_x*depth/100. 11 grad_y=grad_y*depth/100. 12 dx=np.cos(vec_el)*np.cos(vec_az) #光源對x軸的影響 13 dy=np.cos(vec_el)*np.sin(vec_az) #光源對y軸的影響 14 dz=np.sin(vec_el) #光源對z軸的影響 15 A=np.sqrt(grad_x**2+grad_y**2+1.) 16 uni_x=grad_x/A 17 uni_y=grad_y/A 18 uni_z=1./A 19 a2=255*(dx*uni_x+dy*uni_y+dz*uni_z) #光源歸一化 20 a2=a2.clip(0,255) 21 im2=Image.fromarray(a2.astype('uint8')) #重構圖像 22 im2.save('pic_handdraw.jpg')