教你如何繪制數學函數圖像——numpy和matplotlib的簡單應用


numpy和matplotlib的簡單應用

一、numpy庫

1.什么是numpy

NumPy系統是Python的一種開源的數值計算擴展。這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結構要高效的多(該結構也可以用來表示矩陣(matrix))。

numpy是科學計算包,支持N維數組運算、處理大型矩陣、成熟的廣播函數庫、矢量運算、線性代數、傅里葉變換、隨機數生成,並可與C++/Fortran語言無縫結合。

2.numpy的安裝

在Python v3中默認安裝已經包含了numpy

如果沒有安裝,可以在命令行(ctrl+R,輸入cmd)中輸入pip install numpy即可自動安裝使用

3.numpy的使用

注意:這里的矩陣跟線性代數(高等代數)中的矩陣一致,運算方法一致

(1)導入模塊

import numpy as np  #用np來代替numpy

(2)生成數組(創建數組)

 1 import numpy as np  2 print(np.array([1, 2, 3, 4, 5]))        # 把列表轉換為數組
 3 print(np.array((1, 2, 3, 4, 5)))        # 把元組轉換成數組
 4 print(np.array(range(5)))               # 把range對象轉換成數組
 5 print(np.array([[1, 2, 3], [4, 5, 6]])) # 二維數組
 6 print(np.arange(8))                     # 類似於內置函數range()
 7 print(np.arange(1, 10, 2))  8 print(np.linspace(0, 10, 11))         # 等差數組,包含11個數
 9 print(np.linspace(0, 10, 11, endpoint=False)) # 不包含終點
10 print(np.logspace(0, 100, 10))        # 對數數組
11 print(np.logspace(1,6,5, base=2))     # 對數數組,相當於2 ** np.linspace(1,6,5)
12 print(np.zeros(3))                    # 全0一維數組
13 print(np.ones(3))                     # 全1一維數組
14 print(np.zeros((3,3)))              # 全0二維數組,3行3列
15 print(np.zeros((3,1)))              # 全0二維數組,3行1列
16 print(np.zeros((1,3)))              # 全0二維數組,1行3列
17 print(np.ones((1,3)))               # 全1二維數組
18 print(np.ones((3,3)))               # 全1二維數組
19 print(np.identity(3))      # 單位矩陣
20 print(np.identity(2)) 21 print(np.empty((3,3)))     # 空數組,只申請空間而不初始化,元素值是不確定的

結果如圖所示(因為是一次性輸出全部,所以顯示不是很好)

 

(3)數組的運算

1/ 數組與數值的運算

x=np.array((1,2,3,4,5))    #創建數組

x*2     #乘法

x/2     #除法

x//2    #整除

x**3    #冪次方

x+2     #加法

x%3     #求余

2**x      #2的(x中的每一個元素)次方,同時生成另一個數組

2/x     #2除以x中的每一個元素,同時生成另外一個數組

63//x     #63除以x中的每一個元素,取整數,同時生成另外一個數組

 

2/ 數組與數組的運算

a= np.array((1,2,3))                             #先創建兩個數組

b=np.array(([1,2,3],[4,5,6],[7,8,9]))

數組之間的基本運算

c=a*b    

c/b

a+a

a*a

c-a

c/a

 

(4) 數組的轉置

b=np.array(([1,2,3],[4,5,6],[7,8,9]))

b.T             #轉置

值得注意的是:一維數組轉置以后和原來是一樣的

 

(5)點積和內積

 a = np.array((5, 6, 7))                                #創建數組a

 b = np.array((6, 6, 6))                                #創建數組b

 a.dot(b)                                        #向量內積

 np.dot(a,b)

 c = np.array(([1,2,3],[4,5,6],[7,8,9]))            # 二維數組

  c.dot(a)                                        # 二維數組的每行與一維向量計算內積

  a.dot(c)                                # 一維向量與二維向量的每列計算內積

 

(6) 元素訪問

b = np.array(([1,2,3],[4,5,6],[7,8,9]))

b[0]                                 # 第0行

b[0][0]                          # 第0行第0列的元素值

b[0,2]                                 # 第0行第2列的元素值

b[[0,1]]                             # 第0行和第1行

b[[0,1], [1,2]]                       #第0行第1列的元素和第1行第2列的元素

 x = np.arange(0,100,10,dtype=np.floating)

 x[[1, 3, 5]]                               # 同時訪問多個位置上的元素

 x[[1, 3, 5]] = 3                          # 把多個位置上的元素改為相同的值

 x[[1, 3, 5]] = [34, 45, 56]                # 把多個位置上的元素改為不同的值

 

(7)數組支持函數運算

np.sin(x)                                   #求正弦值

np.cos(x)                        #求余弦值

np.round(_)                       #四舍五入

x = np.random.rand(10) * 10                         # 包含10個隨機數的數組

np.floor(x)                                     # 所有元素向下取整

np.ceil(x)                        # 所有元素向上取整

 

(8) 改變數組大小

a = np.arange(1, 11, 1)                                 #創建一維數組

a.shape = 2, 5                       #將數組改為2行5列

a.shape = 5, -1                                   #將元素分成5列, -1表示自動計算,原地修改

b = a.reshape(2,5)                              # reshape()方法返回新數組

 

(9) 切片操作

a[::-1]                                      # 反向切片

a[::2]                                       # 隔一個取一個元素

a[:5]                                        # 前5個元素

c[0, 2:5]                              # 第0行中下標[2,5)之間的元素值

c[1]                                    # 第1行所有元素

c[2:5, 2:5]                              # 行下標和列下標都介於[2,5)之間的元素值

 

(10) 布爾運算(結果一般是True或者False顯示)

x > 0.5                                # 比較數組中每個元素值是否大於0.5

x[x>0.5]                                 # 獲取數組中大於0.5的元素,可用於檢測和過濾異常值

x < 0.5

np.all(x<1)                        # 測試是否全部元素都小於1

np.any([1,2,3,4])                         # 是否存在等價於True的元素

a > b                                     # 兩個數組中對應位置上的元素比較

a[a>b]                          #輸出相對應元素a>b的元素位置

 

(11)取整運算

x = np.random.rand(10)*50                   # 10個隨機數

np.int64(x)                         # 取整

np.int32(x)

 

(12)廣播

a = np.arange(0,60,10).reshape(-1,1)              # 創建列向量

b = np.arange(0,6)                               # 創建行向量

a[0] + b                                         # 數組與標量的加法

a + b                           #行向量與列向量的相加

a*b                           #行向量與列向量的相乘

 

(13) 計算唯一值以及出現的次數

x = np.random.randint(0, 10, 7)                         #創建0到10之間的隨機數,個數為7

np.bincount(x)                      #計算元素出現的次數,由最小的元素開始,到最大值

np.sum(_)                            # 所有元素出現次數之和等於數組長度

np.unique(x)                         # 返回唯一元素值

 

(14) 矩陣運算

a_list = [3, 5, 7]

a_mat = np.matrix(a_list)                        # 創建矩陣

a_mat.T                                        # 矩陣轉置

a_mat.shape                                    # 矩陣形狀

a_mat.size                                     # 元素個數

a_mat.mean()                                     # 元素平均值

a_mat.sum() # 所有元素之和

a_mat.max() # 最大值

a_mat.max(axis=1)                               # 橫向最大值

a_mat.max(axis=0)                       # 縱向最大值

a_mat * b_mat.T                                 # 矩陣相乘

c_mat = np.matrix([[1, 5, 3], [2, 9, 6]])               # 創建二維矩陣

c_mat.argsort(axis=0)                                   # 縱向排序后的元素序號

c_mat.argsort(axis=1)                              # 橫向排序后的元素序號

d_mat.diagonal()                                        # 矩陣對角線元素

x = np.matrix(np.random.randint(0, 10, size=(3,3)))

x.std()                                       # 標准差

x.std(axis=1)                                   # 橫向標准差

x.std(axis=0)                                # 縱向標准差

x.var(axis=0)                       # 縱向方差

 

 

二、matplotlib庫

1.什么是matplotlib庫

matplotlib模塊依賴於numpy模塊和tkinter模塊,可以繪制多種形式的圖形,包括線圖、直方圖、餅狀圖、散點圖、誤差線圖等等。

2.matplotlib庫的安裝

在命令行(ctrl+R,輸入cmd)中輸入pip install matplotlib即可自動安裝使用

3.matplotlib庫的的使用

導入

import matplotlib 

 繪制正弦函數圖像

 1 import numpy as np  2 import pylab as pl  3 
 4 t = np.arange(0.0, 2.0*np.pi, 0.01)  #生成數組,0到2π之間,以0.01為步長
 5 s = np.sin(t)                        #對數組中所有元素求正弦值,得到新數組
 6 pl.plot(t,s)                         #畫圖,以t為橫坐標,s為縱坐標
 7 pl.xlabel('x')                       #設置坐標軸標簽
 8 pl.ylabel('y')  9 pl.title('sin')                                    #設置圖形標題
10 pl.show()                                          #顯示圖形

結果如圖所示

 

繪制散點圖

1 import numpy as np 2 import pylab as pl 3 a = np.arange(0, 2.0*np.pi, 0.1) 4 b = np.cos(a) 5 pl.scatter(a,b) 6 pl.show()

結果如圖所示

 繪制帶有中文標簽和圖例的圖像

 1 import numpy as np  2 import pylab as pl  3 import matplotlib.font_manager as fm  4 
 5 myfont = fm.FontProperties(fname=r'C:\Windows\Fonts\STKAITI.ttf') #設置字體
 6 t = np.arange(0.0, 2.0*np.pi, 0.01)                       # 自變量取值范圍
 7 s = np.sin(t)                                             # 計算正弦函數值
 8 z = np.cos(t)                                             # 計算余弦函數值
 9 pl.plot(t, s, label='正弦') 10 pl.plot(t, z, label='余弦') 11 pl.xlabel('x-變量', fontproperties='STKAITI', fontsize=18) # 設置x標簽
12 pl.ylabel('y-正弦余弦函數值', fontproperties='simhei', fontsize=18) 13 pl.title('sin-cos函數圖像', fontproperties='STLITI', fontsize=24) 14 pl.legend(prop=myfont)                                                          # 設置圖例
15 pl.show()

結果如圖所示

 

等等~~~~~~~~~~~~~~~

 

三、用雷達圖表示python123中的成績數據

 1 import numpy as np  2 import matplotlib.pyplot as plt  3 import matplotlib  4 matplotlib.rcParams['font.family']='LiSu'#定義字體
 5 matplotlib.rcParams['font.sans-serif'] = ['LiSu']  6 labels=np.array(['第一周','第二周','第三周','第四周','第五周','第六周'])#定義標簽
 7 data=np.array([8,10,9,10,11,7])  8 angles=np.linspace(0,2*np.pi,6,endpoint=False)  9 data=np.concatenate((data,[data[0]])) 10 angles=np.concatenate((angles,[angles[0]])) 11 fig=plt.figure(facecolor="yellow")#顏色設置
12 plt.subplot(111,polar=True) 13 plt.plot(angles,data,'bo-',color='g',linewidth=2) 14 plt.fill(angles,data,facecolor='g',alpha=0.25) 15 plt.thetagrids(angles*180/np.pi,labels) 16 plt.figtext(0.52,0.95,'xiayiLL的python123成績雷達圖',ha='center')#圖像命名
17 plt.grid(True) 18 plt.show()

結果如圖所示

 

 四、自定義手繪風

 代碼如下

 1 # -*- coding: utf-8 -*-
 2 
 3 ''' 手繪圖像效果 '''
 4 import numpy as np
 5 from PIL import Image
 6 vec_el = np.pi/2.2   # 光源的俯視角度,弧度值
 7 vec_az = np.pi/4.    # 光源的方位角度,弧度值
 8 depth = 6.          # 深度權值,值越小背景區域越接近白色,值越大背景區域越接近黑色
 9 im = Image.open('C:\\Users\Administrator\Desktop\spyder\路飛.jpg').convert('L')     # 打開圖像並轉變為灰度模式
10 a = np.asarray(im).astype('float')
11 grad = np.gradient(a)              # 取圖像灰度的梯度值
12 grad_x, grad_y = grad              # 分別取圖像的橫縱梯度值
13 grad_x = grad_x * depth / 100.
14 grad_y = grad_y * depth / 100.
15 dx = np.cos(vec_el) * np.cos(vec_az) # 光源對x軸的影響
16 dy = np.cos(vec_el) * np.sin(vec_az) # 光源對y軸的影響
17 dz = np.sin(vec_el)                  # 光源對z軸的影響
18 A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
19 uni_x = grad_x/A
20 uni_y = grad_y/A
21 uni_z = 1./A
22 a2 = 255*(dx * uni_x + dy * uni_y + dz * uni_z) # 光源歸一化
23 a2 = a2.clip(0, 255)                 # 預防溢出
24 im2 = Image.fromarray(a2.astype('uint8'))       # 重構圖像
25 im2.save('HandMade_.jpg') # 保存圖像
26 im2.show()                # 顯示圖像

 

原圖如下

 

經代碼轉變手繪圖

 

 五、感興趣的圖像

 分段函數圖像,代碼如下

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3  
 4 x = np.linspace(0,100,1000)
 5 interval0 = [1 if (i<30) else 0 for i in x]
 6 interval1 = [1 if (i>=30 and i<50) else 0 for i in x]
 7 interval2 = [1 if (i>=50) else 0 for i in x]
 8 y = np.cos(x)* interval0 + x * interval1 + np.sin(x)*interval2
 9 plt.plot(x,y)
10 plt.show()

結果如圖所示

 


免責聲明!

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



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