1. 程式人生 > >數學建模三劍客 MSN

數學建模三劍客 MSN

前言

不管是不是巴薩的球迷,只要你喜歡足球,就一定聽說過梅西(Messi)、蘇亞雷斯(Suarez)和內馬爾(Neymar)這個MSN組合。在眾多的數學建模輔助工具中,也有一個犀利無比的MSN組合,他們就是python麾下大名鼎鼎的 Matplotlib + Scipy + Numpy三劍客。

本文是我整理的MSN學習筆記,有些理解可能比較膚淺,甚至是錯誤的。如果因此誤導了某位看官,在工作中造成重大失誤或損失,我頂多只能賠償一頓飯——還得是我們樓下的十元盒飯。特此宣告。

文中程式碼均從我的這臺時不時出點問題、鬧個情緒的Yoga 3 pro上覆制而來,這意味著所有的程式碼均可在下面的執行環境中順利執行:

  • pyhton 2.7.8
  • numpy 1.11.1
  • scipy 0.16.1
  • matplotlib 1.5.1

三劍客之Numpy

numpy是一個開源的python科學計算庫,包含了很多實用的數學函式,涵蓋線性代數、傅立葉變換和隨機數生成等功能。最初的numpy其實是scipy的一部分,後來才從scipy中分離出來。

numpy不是python的標準庫,需要單獨安裝。假定你的執行環境已經安裝了python包管理工具pip,numpy的安裝就非常簡單:

1 pip install numpy

陣列物件

ndarray是多維陣列物件,也是numpy最核心的物件。在numpy中,陣列的維度(dimensions)叫做軸(axes),軸的個數叫做秩(rank)。通常,一個numpy陣列的所有元素都是同一種類型的資料,而這些資料的儲存和陣列的形式無關。

下面的例子,建立了一個三維的陣列(在匯入numpy時,一般都簡寫成np)。

12 import numpy asnpa=np.array([[1,2,3],[4,5,6],[7,8,9]])

資料型別

numpy支援的資料型別主要有布林型(bool)、整型(integrate)、浮點型(float)和複數型(complex),每一種資料型別根據佔用記憶體的位元組數又分為多個不同的子型別。常見的資料型別見下表。

型別 描述
bool 用1位儲存的布林型別(值為TRUE或FALSE)
inti 由所在平臺決定其精度的整數(一般為int32或int64)
int8 1位元組整數
int16 2位元組整數
int32 4位元組整數
int64 8位元組整數
uint8 1位元組無符號整數
uint16 2位元組無符號整數
uint32 4位元組無符號整數
uint64 8位元組無符號整數
float16 半精度浮點數(16位),1位符號,5位指數,10位尾數
float32 單精度浮點數(32位),1位符號,8位指數,23位尾數
float64/float 雙精度浮點數(64位),1位符號,11位指數,52位尾數
complex64 複數,分別用32位表示實部和虛部
complex128/complex 複數,分別用64位表示實部和虛部

建立陣列

通常,我們用np.array()建立陣列。如果僅僅是建立一維陣列,也可以使用np.arange()或者np.linspace()的方法。np.zeros()、np.ones()、np.eye()則可以構造特殊的資料。np.random.randint()和np.random.random()則可以構造隨機數陣列。

123456789101112131415161718192021222324252627282930313233 >>>np.array([[1,2,3],[4,5,6]])# 預設元素型別為int32array([[1,2,3],[4,5,6]])>>>np.array([[1,2,3],[4,5,6]],dtype=np.int8)# 指定元素型別為int8array([[1,2,3],[4,5,6]],dtype=int8)>>>np.arange(5)# 預設元素型別為int32array([0,1,2,3,4])>>>np.arange(3,8,dtype=np.int8)# 指定元素型別為int8array([3,4,5,6,7],dtype=int8)>>>np.arange(12).reshape(3,4)# 改變shapearray([[0,1,2,3],[4,5,6,7],[8,9,10,11]])>>>np.linspace(1,2,5)# 從1到2生成5個浮點數array([1.,1.25,1.5,1.75,2.])>>>np.zeros((2,3))# 全0陣列array([[0.,0.,0.],[0.,0.,0.]])>>>np.ones((2,3))# 全1陣列array([[1.,1.,1.],[1.,1.,1.]])>>>np.eye(3)# 主對角線元素為1其他元素為0array([[1.,0.,0.],[0.,1.,0.],[0.,0.,1.]])>>>np.random.random((2,3))# 生成[0,1)之間的隨機浮點數array([[0.84731148,0.8222318,0.85799278],[0.59371558,0.92330741,0.04518351]])>>>np.random.randint(0,10,(3,2))# 生成[0,10)之間的隨機整數array([[2,4],[8,3],[8,5]])

構造複雜陣列

很多時候,我們需要從簡單的資料結構,構造出複雜的陣列。例如,用一維的資料生成二維格點。

重複陣列: tile

123456789 >>>a=np.arange(5)>>>aarray([0,1,2,3,4])>>>np.tile(a,2)array([0,1,2,3,4,0,1,2,3,4])>>>np.tile(a,(3,2))array([[0,1,2,3,4,0,1,2,3,4],[0,1,2,3,4,0,1,2,3,4],[0,1,2,3,4,0,1,2,3,4]])

一維陣列網格化: meshgrid

12345678910111213 >>>a=np.arange(5)>>>b=np.arange(5,10)>>>np.meshgrid(a,b)[array([[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4]]),array([[5,5,5,5,5],[6,6,6,6,6],[7,7,7,7,7],[8,8,8,8,8],[9,9,9,9,9]])]>>>

指定範圍和分割方式的網格化: mgrid

12345678910111213141516 >>>np.mgrid[0:1:2j,1:2:3j]array([[[0.,0.,0.],[1.,1.,1.]],[[1.,1.5,2.],[1.,1.5,2.]]])>>>np.mgrid[0:1:0.3,1:2:0.4]array([[[0.,0.,0.],[0.3,0.3,0.3],[0.6,0.6,0.6],[0.9,0.9,0.9]],[[1.,1.4,1.8],[1.,1.4,1.8],[1.,1.4,1.8],[1.,1.4,1.8]]])

上面的例子中用到了虛數。構造虛數的方法如下:

12 >>>complex(2,5)(2+5j)

陣列的屬性

numpy的陣列物件除了一些常規的屬性外,也有幾個類似轉置、扁平迭代器等看起來更像是方法的屬性。扁平迭代器也許是遍歷多維陣列的一個簡明方法,下面的程式碼給出了一個例子。

12345678910111213141516171819202122 >>>a=np.array([[1,2,3],[4,5,6]])>>>a.dtype# 陣列元素的資料型別dtype('int32')>>>a.dtype.itemsize# 陣列元素佔據的記憶體位元組數4>>>a.itemsize# 陣列元素佔據的記憶體位元組數4>>>a.shape# 陣列的維度(2,3)>>>a.size# 陣列元素個數6>>>a.T# 陣列行變列,類似於transpose()array([[1,4],[2,5],[3,6]])>>>a.flat# 返回一個扁平迭代器,用於遍歷多維陣列<numpy.flatiter objectat0x037188F0>

相關推薦

no