1. 程式人生 > >科學計算和可視化

科學計算和可視化

port 環境 冰山一角 關註 ada pri 打印 設置顏色 ext

今天的主題是有關科學計算和可視化的,其中將會包括有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()

效果:
技術分享圖片

直觀又美觀!相當棒!

那麽今天的學習分享就先到這裏啦~謝謝關註!!

科學計算和可視化