Python 之 Numpy庫以及Matplotlib庫的學習


  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()
View Code

    效果如下:

 

 

 

   四、自定義手繪風

 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')
View Code

      

 

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM