科學計算和可視化
今天的主題是有關科學計算和可視化的,其中將會包括有python的第三方庫numpy以及matplotlib的學習總結及應用!
有所涉獵的同學一定對這兩個庫並不陌生!它們分別是對數組的處理和數據處理的圖表制作工具,在數據處理方面它們都有不俗的表現!
接下來先讓我簡單介紹一下這兩個庫~(安裝過程就不詳述啦~pip install +庫就能隨心安裝,或者你也可以選擇直接安裝Anaconda 強大的庫函數多到你用不完,裏面自然有今天所要展開了解的兩個庫啦~)
numpy:
概述:numpy(Numerical Python)提供了python對多維數組對象的支持:ndarray,具有矢量運算能力,快速、節省空間。numpy支持高級大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫,它在數據處理方面有它不俗的表現力。
創建ndarray數組:ndarray:N維數組對象(矩陣),所有元素必須是相同類型。
ndarray屬性:ndim屬性,表示維度個數;shape屬性,表示各維度大小;dtype屬性,表示數據類型。
一些函數匯總:
函數 | 說明 |
array | 將輸入數據(列表、元組、數組或其他序列類型)轉換為ndarray、要麽推斷出dtype,要麽顯示指定dtpye。默認直接復制輸入數據 |
asarray | 將輸入轉換為ndarray,如果輸入本身就是一個ndarray將不進行復制 |
arange | 類似於內置的range,但返回的是一個ndarray而不是列表 |
ones、ones_like | 根據指定的形狀和dtpye創建一個全1的數組。ones_like以另一個數組為參數,並根據其形狀和dtype創建一個全1的數組 |
zeros、zeros_like | 類似上一項,創建全為0的數組 |
empty、empty_like | 創建新數組,只分配內存空間但不填充任何值 |
eye、identity | 創建一個正方的N*N單位矩陣(對角線為1,其余為0) |
當然還有一些通用函數,比如說我們的math庫中的一些計算函數fabs,abs,sqrt,sin,cos等等,這些同樣適合於ndarray,這裏就不一一列舉了。
現在來看看我們的實例應用吧~
實驗一:
import numpy print (‘使用列表生成一維數組‘) data = [1,2,3,4,5] x = numpy.array(data) print (x) print (x.dtype) print (x.ndim) print (x.shape) print (‘使用列表生成二維數組‘) data = [[1,0],[2,0],[3,0]] x = numpy.array(data) print (x) print (x.ndim) print (x.shape) print (‘使用zero/ones/empty創建數組:根據shape來創建‘) x = numpy.zeros(5) print (x) x = numpy.zeros((3,3)) print (x) x = numpy.ones((2,3)) print (x) x = numpy.empty((3,2)) print (x) print (‘使用arrange生成連續元素‘) print (numpy.arange(5)) print (numpy.arange(0,5,2))
效果:
我們看到這個試驗中我們新建了一些特殊數組(單位數組即全1數組,全0數組,以及一、二維數組,當然還有其中各元素的type(類型)的討論)
我們還可以學習到numpy中的ndarray的數據類型,有大致下面幾種:
類型 | 類型代碼 | 說明 |
int8、uint8 | i1、u1 | 有符號或無符號的8位(1個字節)整型 |
int16、uint16 | i2、u2 | 有符號或無符號的16位(2個字節)整型 |
int32、uint32 | i4、u4 | 有符號或無符號的32位(4個字節)整型 |
int64、uint64 | i8、u8 | 有符號或無符號的64位(8個字節)整型 |
float16 | f2 | 半精度浮點數 |
float32 | f4/f | 標準的單精度浮點數。與C的float兼容 |
float64 | f8/d | 標準的雙精度浮點數。與C的double和python的float對象兼容 |
float128 | f16/g | 擴展精度浮點數 |
complex64、complex128 | c8/c16 | 分別用兩個32位、64位或128位的浮點數表示復數 |
complex256 | c32 | 復數 |
bool | ? | 儲存True和False值的布爾類型 |
object | O | python對象類型 |
string_ | S | 固定長度的字符串類型(每個字符1個字符)S10即為創建長度為10的字符串 |
unicode_ | U | 固定長度的unicode類型(字節數由平臺決定)U10即為創建長度為10的unicode |
實驗二:
import numpy print (‘生成指定元素類型的數組:設置dtype屬性‘) x = numpy.array([1,2.6,3],dtype = numpy.int64) print (x) print (x.dtype) print (x.ndim) print (x.shape) x = numpy.array([1,2,3],dtype = numpy.float64) print (x) print (x.dtype) print (x.ndim) print (x.shape) x = numpy.array([-1,-2,-3,-4],dtype = numpy.uint16) print (x) print (x.dtype) print (x.ndim) print (x.shape) print (‘使用astype復制數組,並轉換類型‘) x = numpy.array([1,2.6,3],dtype = numpy.float64) y = x.astype(numpy.int32) print (y) print (x) print (x.ndim) print (x.shape) z = y.astype(numpy.float64) print (z) print (x.ndim) print (x.shape) print (‘將字符串元素轉換為數值元素‘) x = numpy.array([‘1‘,‘2‘,‘3‘],dtype = numpy.string_) y = x.astype(numpy.int32) print (x) print (x.ndim) print (x.shape) print (y) print (‘使用其他數組的數據類型作為參數‘) x = numpy.array([ 1., 2.6,3. ],dtype = numpy.float32) y = numpy.arange(3,dtype=numpy.int32) print (y) print (y.astype(x.dtype))
效果:
在這個實驗中,我們具體討論了數組的不同數據類型的情況下生成數據的例子,我們嘗試了int,float,和uint三種形式,得到了想要的結果(其中我們知道uint是無符號整型,它在計算機內存中一其相對應正數的補碼形式存在,故會出現上述情況,-1的補碼是1111 1111,值為10進制數為65535)我們還對dtype屬性進行討論,嘗試了復制其屬性的功能……
實驗三:
import numpy print (‘ndarray數組與標量/數組的運算‘) x = numpy.array([1,2,3]) print (x*2) print (x**2) print (x>2) y = numpy.array([3,4,5]) print (x+y) print (x^y) print (x>y) print (‘ndarray的花式索引:使用整型數組作為索引‘) x = numpy.array([1,2,3,4,5,6]) print (x[[0,1,2]]) print (x[[-1,-2,-3]]) x = numpy.array([[1,2],[3,4],[5,6]]) print (x[[0,1]]) print (x[[0,1],[0,1]]) # [1,4] 打印x[0][0]和x[1][1] print (x[[0,1]][:,[0,1]]) # 打印01行的01列 [[1,2],[3,4]] # 使用numpy.ix_()函數增強可讀性 print (x[numpy.ix_([0,1],[0,1])]) x[[0,1],[0,1]] = [0,0] print (x)# [[0,2],[3,0],[5,6]]
效果:
該例有數組之間的簡單的數乘運算以及bool運算和花式索引的實現~
實驗四:
import numpy print (‘ndarray數組的轉置和軸對換‘) k = numpy.arange(9) m = k.reshape((3,3)) # 改變數組的shape復制生成2維的,每個維度長度為3的數組 print (k) print (m) # 轉置(矩陣)數組:T屬性 : mT[x][y] = m[y][x] print (m.T) # 計算矩陣的內積 xTx print (numpy.dot(m,m.T)) # numpy.dot點乘 # 高維數組的軸對象 k = numpy.arange(8).reshape(2,2,2) print (k) print (k[1][0][0]) # 軸變換 transpose 參數:由軸編號組成的元組 m = k.transpose((1,0,2)) print (m) print (m[0][1][0]) # 軸交換 swapaxes (axes:軸),參數:一對軸編號 m = k.swapaxes(0,1) print (m) print (m[0][1][0]) # 使用軸交換進行數組矩陣轉置 m = numpy.arange(9).reshape((3,3)) print (m) print (m.swapaxes(1,0))
效果:
該例,就是有關數列或說矩陣的基本運算(數乘運算,轉置,點乘等)……
學習了這些numpy庫已經在日常中基本夠用,當然它還有很多值得探討深挖的部分,上述只是冰山一角哦~當然不要忘了多加練習!!
matplotlib:
概述:matplotlib是基於numpy的一套Python工具包。這個包提供了豐富的數據繪圖工具,主要用於繪制一些統計圖形。
在這個強大的庫的學習過程中,我得到了一個非常有用的消息:IPython的使用,特別在matplotlib的運用中,這個環境下的表現出乎意料的好!不禁感嘆聰明的計算機工程師大觸們的才智之高!
那麽如何使用IPython庫呢?
一樣用cmd命令行,利用指令"ipython --pylab"就可以調用出IPython環境:
然後輸入代碼(從網上copy並稍作修改):
效果:
非常nice的效果,直觀又美觀!matplotlib實在是作圖做表神器!
matplotlib參數設置:
在代碼執行過程中,有兩種方式更改參數:
- 使用參數字典(rcParams)
- 調用matplotlib.rc()命令 通過傳入關鍵字元組,修改參數
axex: 設置坐標軸邊界和表面的顏色、坐標刻度值大小和網格的顯示
backend: 設置目標暑促TkAgg和GTKAgg
figure: 控制dpi、邊界顏色、圖形大小、和子區( subplot)設置
font: 字體集(font family)、字體大小和樣式設置
grid: 設置網格顏色和線性
legend: 設置圖例和其中的文本的顯示
line: 設置線條(顏色、線型、寬度等)和標記
patch: 是填充2D空間的圖形對象,如多邊形和圓。控制線寬、顏色和抗鋸齒設置等。
savefig: 可以對保存的圖形進行單獨設置。例如,設置渲染的文件的背景為白色。
verbose: 設置matplotlib在執行期間信息輸出,如silent、helpful、debug和debug-annoying。
xticks和yticks: 為x,y軸的主刻度和次刻度設置顏色、大小、方向,以及標簽大小。
作為中國程序員,在面向中國人群體時,我們在制作圖表的過程中免不了會使用中文標註,分析等,那要怎麽加中文字呢?
我們會使用:
import matplotlib.pyplot as plt plt.rcParams[‘font.family‘]=[‘SimHei‘] #用來正常顯示中文標簽 plt.rcParams[‘axes.unicode_minus‘]=False #用來正常顯示負號
還是剛剛的代碼,加了中文的“SimHei”(黑體)顯示,可以有下面的表現形式:
import matplotlib.pyplot as plt plt.rcParams[‘font.family‘]=[‘SimHei‘] plt.rcParams[‘axes.unicode_minus‘]=False labels=‘青蛙‘,‘豬‘,‘狗子‘,‘原木‘ sizes=25,20,45,60 colors=‘yellowgreen‘,‘gold‘,‘lightskyblue‘,‘lightcoral‘ explode=0,0.2,0,0 plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct=‘%1.2f%%‘,shadow=True,startangle=50) plt.axis(‘equal‘) plt.show()
ok~
當制作折線圖的時候,我們還會運用其他一些功能:
線條標記及相關屬性:
線條風格linestyle或ls | 描述 |
‘-‘ | 實線 |
‘—‘ | 破折線 |
‘-.‘ | 點劃線 |
‘:‘ | 虛線 |
‘None‘,‘‘,‘‘ | 什麽都不畫 |
標記masker | 描述 | 標記 | 描述 |
‘o‘ | 圓圈 | ‘.’ | 點 |
‘D‘ | 菱形 | ‘s‘ | 正方形 |
‘h‘ | 六邊形1 | ‘*‘ | 星號 |
‘H‘ | 六邊形2 | ‘d‘ | 小菱形 |
‘_‘ | 水平線 | ‘v‘ | 一角朝下的三角形 |
‘8‘ | 八邊形 | ‘<‘ | 一角朝左的三角形 |
‘p‘ | 五邊形 | ‘>‘ | 一角朝右的三角形 |
‘,‘ | 像素 | ‘^‘ | 一角朝上的三角形 |
‘+‘ | 加號 | ‘\ | ‘ |
‘None‘,‘‘,‘‘ | 無 | ‘x‘ | X |
當然還有顏色,背景顏色等參數的設置,具體跟其他常規庫別無二致。
例如:
通過向如matplotlib.pyplot.axes()
或者matplotlib.pyplot.subplot()
這樣的方法提供一個axisbg
參數,可以指定坐標這的背景色。
subplot(111,axisbg=(0.1843,0.3098,0.3098)
通過更深入的學習,折線圖,條形圖,餅圖,流程圖,梯形圖等等你都能制作,結合numpy的數據分析,你能夠運用強大的計算分析眾多數據,讓你更直觀地認識,理解眼前的世界!
(形式豐富的分析圖形表格)
下面是我的實例!!
成績雷達圖:
import matplotlib.pyplot as plt import numpy as np import matplotlib plt.rcParams[‘font.family‘]=‘SimHei‘ labels=np.array([‘總成績‘,‘單選‘,‘程序題‘,‘剩余用時‘,‘復寫率‘]) nAttr=5 data=np.array([7.4,8,6.8,2,9]) angles=np.linspace(0,2*np.pi,nAttr,endpoint=False) data=np.concatenate((data,[data[0]])) angles=np.concatenate((angles,[angles[0]])) fig=plt.figure(facecolor=‘white‘) plt.subplot(111,polar=True) plt.plot(angles,data,‘b*-‘,color=‘y‘,linewidth=3) plt.fill(angles,data,facecolor=‘g‘,alpha=0.25) plt.thetagrids(angles*180/np.pi,labels) plt.figtext(0.52,0.95,‘iconangle的成績表‘,ha=‘center‘) plt.grid(True) plt.savefig(‘scorce_radar.JPG‘) plt.show()
效果:
看上去我的單選似乎更強一點(聳肩)
進階地,研究一個物理規律:我選擇研究單擺
伽利略曾對單擺的運動產生濃厚的興趣,我通過查找單擺的運動公式,得到一個這樣的單擺周期計算公式:
T=2π√(L/g)
那麽利用numpy以及matplotlib可以繪制出這個規律的模型:
代碼如下:
import matplotlib.pyplot as plt import numpy as np plt.rcParams[‘font.family‘]=‘SimHei‘ plt.title("在重力加速度為9.8m/s的時候單擺的周期(T)與擺長(L)關系") plt.xlabel(‘擺長(L)‘) plt.ylabel(‘周期(T)‘) x=np.linspace(0.0,40.0,1000) y=2*np.pi*np.sqrt(x/9.8) plt.plot(x,y,‘k‘,color=‘g‘,linewidth=3,linestyle=‘-‘) plt.show()
效果:
直觀又美觀!相當棒!
那麽今天的學習分享就先到這裏啦~謝謝關註!!
科學計算和可視化