(1) np.mashgrid()函數: 生成網路點坐標矩陣,可以是二維網路矩陣,也可以是三維網路矩陣。其中,每個交叉點就是網路點,描述這些網路點的矩陣就是坐標矩陣(橫坐標矩陣X中的每個元素與縱坐標矩陣Y中對應位置元素,共同構成一個點的完整坐標)。 背景示例:網路點與坐標矩陣的解釋如下: impor ...
(1) np.mashgrid()函數:-----生成網路點坐標矩陣,可以是二維網路矩陣,也可以是三維網路矩陣。其中,每個交叉點就是網路點,描述這些網路點的矩陣就是坐標矩陣(橫坐標矩陣X中的每個元素與縱坐標矩陣Y中對應位置元素,共同構成一個點的完整坐標)。
背景示例:網路點與坐標矩陣的解釋如下:
import numpy as np
import matplotlib.pyplot as plt
x=np.array([[0,1,2],[0,1,2]]) #最簡單的方法是,可以把橫縱坐標矩陣X,Y寫出來,生成坐標點
y=np.array([[0,0,0],[1,1,1]])
plt.plot(x,y,color='red',marker='.',markersize=10,linestyle='-.') #點的形狀為原點,點設置大一些,線性為電劃線。
plt.grid(True)
plt.show()
註意:按照矩陣給坐標點信息,matplotlib會把橫坐標矩陣中,每一列的點當做同一條線。正如上例中把plot的linestyle=’ ‘改為linestyle=’-.’就會發現A-D,B-E,C-F是連接的。
對於很多網路點的情況,可用如下meshgrid()函數方法:
因註意到坐標矩陣其中有大量的重覆---X的每一行都一樣,Y的每一列都一樣。故基於此規律性,numpy提供的np.meshgrid()函數可以快速生成坐標矩陣X,Y
x=np.linspace(-0.5,2.,10)
y=np.linspace(-1.5,4.,10)
X,Y=np.meshgrid(x,y) #輸入的x,y是網路點的橫縱坐標列向量(非矩陣),輸出的X,Y就是坐標矩陣。
plt.plot(X,Y,color='limegreen',marker='.',linestyle='')
plt.grid(True)
plt.show()
(2) Python可視化庫matplotlib.pyplot里contour()與contourf()函數
區別:contour()和counterf() 函數功能相同,都是畫三維等高線圖的,不同點在於contourf會根據不同的水平值用不同的顏色來填充繪圖(即會對等高線間的區域進行填充)。
contour()和counterf() 都是繪製三維圖,其中前兩個參數x和y為兩個等長一維數組,第三個參數z為二維數組(表示平面點xi和yi映射的函數值)。
matplotlib等高線的繪製步驟:
等高線是三維圖像在二維空間的投影
l 首先準備三維函數及待投影平面的網格坐標。
import numpy as np
import matplotlib.pyplot as plt
def height(x,y):
return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
x=np.linspace(-3,3,300)
y=np.linspace(-3,3,300)
X,Y=np.meshgrid(x,y)
l 繪製等高線
C=plt.contour(X,Y,height(X,Y),10,colors='black') # 10代表等高線的密集程度。如果是0,則圖像被一分為二
plt.contourf(X,Y,height(X,Y),10,alpha=0.75,cmap=plt.cm.hot)
#為等高線填充顏色 10表示按照高度分成10層 alpha表示透明度 cmap表示漸變標準
l 添加高度與數字
plt.clabel(C,inline=True,fontsize=10) #inline=True表示高度寫在等高線上
plt.xticks(())
plt.yticks(())
#去掉坐標軸刻度
plt.show()
#顯示圖片
l 最後結果圖為:
實例:尋找某一函數的最小值
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as so
rosenbrockfunction=lambda x,y: (1-x)**2+100*(y-x**2)**2 #使用lambda關鍵字所表示的匿名函數來使代碼變得更加簡潔
x=np.linspace(-.5,2.,100)
y=np.linspace(-1.5,4.,100)
X,Y=np.meshgrid(x,y)
Z=rosenbrockfunction(X,Y)
cs=plt.contour(X,Y,Z,np.logspace(0,3.5,7,base=10),cmap='gray') #以第四個參數給出的值為標準來繪製等高線並用gray顏色繪圖
#plt.contourf(X,Y,Z,10,alpha=0.75,cmap='gray')
rosen=lambda x:rosenbrockfunction(x[0],x[1])
solution,iterates=so.fmin_powell(rosen,x0=np.array([0,-0.7]),retall=True)
#迭代方法so.fmin_powell利用鮑威爾方法來尋找最小值(由一個給定的起始值x0開始,並且當給出選項retall=True時報告所有的迭代,經過16次迭代後得出x=0,y=0)
x,y=zip(*iterates)
plt.plot(x,y,'ko')
plt.plot(x,y,'k:',linewidth=1)
plt.title('Steps of powells method to compute a minimum')
plt.clabel(cs)
#clabel使用該contour創建的一個等值線集對象來註釋對應函數值的水平值
補充:np.logspace()常用於創建等比數列,它也有常用的3個參數,第一個參數表示起始點的指數,第二個參數終止點的指數,第三個參數表示數列的個數;最後,通過base參數可以修改底數;
(4) 圖像
Imshow()函數:用於在指定的視窗中顯示一幅圖像。它負責對圖像進行處理,並顯示其格式,但是不顯示圖片,其後跟著plt.show()才能顯示出來。
imshow圖像顯示函數:imshow(f,G) 其中,f是函數,G是顯示該圖像的灰度級數。
Imshow(f,[low,high]) 小於或者等於low的值都顯示為黑色,大於或等於high的值都顯示為白色
Imshow(f,[ ]) [ ] 自動將low設為函數最小值,將high設為函數最大值。
Colorbar:增加顏色類標的代碼是plt.colorbar()
例如:import numpy as np
import matplotlib.pyplot as plt
X=np.array([[1,2],[3,4],[5,6]])
plt.imshow(X)
plt.colorbar()
plt.show()
實例:將數組可視化為圖像,
import numpy as np
import matplotlib.pyplot as plt
# 下麵代碼演示瞭如何通過meshgrid生成複數參數值的矩陣:
def mandelbrot(h,w,maxit=20):
X,Y=np.meshgrid(np.linspace(-2,0.8,w),np.linspace(-1.4,1.4,h))
c=X+Y*1j
z=c
exceeds=np.zeros(z.shape,dtype=bool)
for iteration in range(maxit):
z=z**2+c
exceeded=np.abs(z) > 4
exceeds_now=exceeded & (np.logical_not(exceeds))
exceeds[exceeds_now] = True
z[exceeded]=2
return (exceeds)
#命令imshow將矩陣展示為圖像,所選的顏色貼圖顯示了序列出現的白色無界的區域,而其他區域顯示為黑色。
plt.imshow(mandelbrot(400,400),cmap='gray')
plt.axis('off') #使用plt.axis('off') 關閉坐標軸
plt.show()
# 使用imshow的無插值的圖像
註意:imshow命令預設使用插值使圖像看起來更好,這在矩陣較小時可以看的很清楚。
plt.imshow(mandelbrot(400,400),interpolation='nearest',cmap='gray')
Interpolation代表插值運算,nearest表示最近鄰近插值法,只是插值方式中的一種。
cmap表示繪圖時的樣式,這裡選擇的是ocean主題。
#使用最近鄰近插值法所得的圖像