新聞中心
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
本篇文章給大家分享的是有關(guān)Python中常用的數(shù)學(xué)建模Numpy,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
三劍客之Numpy
numpy是一個開源的python科學(xué)計算庫,包含了很多實用的數(shù)學(xué)函數(shù),涵蓋線性代數(shù)、傅里葉變換和隨機數(shù)生成等功能。最初的numpy其實是scipy的一部分,后來才從scipy中分離出來。
numpy不是python的標(biāo)準(zhǔn)庫,需要單獨安裝。假定你的運行環(huán)境已經(jīng)安裝了python包管理工具pip,numpy的安裝就非常簡單:
pip install numpy
一、數(shù)組對象
ndarray是多維數(shù)組對象,也是numpy最核心的對象。在numpy中,數(shù)組的維度(dimensions)叫做軸(axes),軸的個數(shù)叫做秩(rank)。通常,一個numpy數(shù)組的所有元素都是同一種類型的數(shù)據(jù),而這些數(shù)據(jù)的存儲和數(shù)組的形式無關(guān)。
下面的例子,創(chuàng)建了一個三維的數(shù)組(在導(dǎo)入numpy時,一般都簡寫成np)。
import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9]])
1、數(shù)據(jù)類型
numpy支持的數(shù)據(jù)類型主要有布爾型(bool)、整型(integrate)、浮點型(float)和復(fù)數(shù)型(complex),每一種數(shù)據(jù)類型根據(jù)占用內(nèi)存的字節(jié)數(shù)又分為多個不同的子類型。常見的數(shù)據(jù)類型見下表。
2、創(chuàng)建數(shù)組
通常,我們用np.array()創(chuàng)建數(shù)組。如果僅僅是創(chuàng)建一維數(shù)組,也可以使用np.arange()或者np.linspace()的方法。np.zeros()、np.ones()、np.eye()則可以構(gòu)造特殊的數(shù)據(jù)。np.random.randint()和np.random.random()則可以構(gòu)造隨機數(shù)數(shù)組。
>>> np.array([[1,2,3],[4,5,6]]) # 默認(rèn)元素類型為int32 array([[1, 2, 3], [4, 5, 6]]) >>> np.array([[1,2,3],[4,5,6]], dtype=np.int8) # 指定元素類型為int8 array([[1, 2, 3], [4, 5, 6]], dtype=int8) >>> np.arange(5) # 默認(rèn)元素類型為int32 array([0, 1, 2, 3, 4]) >>> np.arange(3,8, dtype=np.int8) # 指定元素類型為int8 array([3, 4, 5, 6, 7], dtype=int8) >>> np.arange(12).reshape(3,4) # 改變shape array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> np.linspace(1,2,5) # 從1到2生成5個浮點數(shù) array([ 1. , 1.25, 1.5 , 1.75, 2. ]) >>> np.zeros((2,3)) # 全0數(shù)組 array([[ 0., 0., 0.], [ 0., 0., 0.]]) >>> np.ones((2,3)) # 全1數(shù)組 array([[ 1., 1., 1.], [ 1., 1., 1.]]) >>> np.eye(3) # 主對角線元素為1其他元素為0 array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>> np.random.random((2,3)) # 生成[0,1)之間的隨機浮點數(shù) array([[ 0.84731148, 0.8222318 , 0.85799278], [ 0.59371558, 0.92330741, 0.04518351]]) >>> np.random.randint(0,10,(3,2)) # 生成[0,10)之間的隨機整數(shù) array([[2, 4], [8, 3], [8, 5]])
3、構(gòu)造復(fù)雜數(shù)組
很多時候,我們需要從簡單的數(shù)據(jù)結(jié)構(gòu),構(gòu)造出復(fù)雜的數(shù)組。例如,用一維的數(shù)據(jù)生成二維格點。
(1)重復(fù)數(shù)組:tile
>>> a = np.arange(5) >>> a array([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]])
(2)重復(fù)元素:repeat
>>> a = np.arange(5) >>> a array([0, 1, 2, 3, 4]) >>> a.repeat(2) array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4])
(3)一維數(shù)組網(wǎng)格化:meshgrid
>>> 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]])] >>>
(4)指定范圍和分割方式的網(wǎng)格化:mgrid
>>> 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]]])
上面的例子中用到了虛數(shù)。構(gòu)造虛數(shù)的方法如下:
>>> complex(2,5) (2+5j)
4、數(shù)組的屬性
numpy的數(shù)組對象除了一些常規(guī)的屬性外,也有幾個類似轉(zhuǎn)置、扁平迭代器等看起來更像是方法的屬性。扁平迭代器也許是遍歷多維數(shù)組的一個簡明方法,下面的代碼給出了一個例子。
>>> a = np.array([[1,2,3],[4,5,6]]) >>> a.dtype # 數(shù)組元素的數(shù)據(jù)類型 dtype('int32') >>> a.dtype.itemsize # 數(shù)組元素占據(jù)的內(nèi)存字節(jié)數(shù) 4 >>> a.itemsize # 數(shù)組元素占據(jù)的內(nèi)存字節(jié)數(shù) 4 >>> a.shape # 數(shù)組的維度 (2, 3) >>> a.size # 數(shù)組元素個數(shù) 6 >>> a.T # 數(shù)組行變列,類似于transpose() array([[1, 4], [2, 5], [3, 6]]) >>> a.flat # 返回一個扁平迭代器,用于遍歷多維數(shù)組>>> for item in a.flat: print item
5、改變數(shù)組維度
numpy數(shù)組的存儲順序和數(shù)組的維度是不相干的,因此改變數(shù)組的維度是非常便捷的操作,除resize()外,這一類操作不會改變所操作的數(shù)組本身的存儲順序。
>>> a = np.array([[1,2,3],[4,5,6]]) >>> a.shape # 查看數(shù)組維度 (2, 3) >>> a.reshape(3,2) # 返回3行2列的數(shù)組 array([[1, 2], [3, 4], [5, 6]]) >>> a.ravel() # 返回一維數(shù)組 array([1, 2, 3, 4, 5, 6]) >>> a.transpose() # 行變列(類似于矩陣轉(zhuǎn)置) array([[1, 4], [2, 5], [3, 6]]) >>> a.resize((3,2)) # 類似于reshape,但會改變所操作的數(shù)組 >>> a array([[1, 2], [3, 4], [5, 6]])
6、索引和切片
對于一維數(shù)組的索引和切片,numpy和python的list一樣,甚至更靈活。
a = np.arange(9) >>> a[-1] # 最后一個元素 8 >>> a[2:5] # 返回第2到第5個元素 array([2, 3, 4]) >>> a[:7:3] # 返回第0到第7個元素,步長為3 array([0, 3, 6]) >>> a[::-1] # 返回逆序的數(shù)組 array([8, 7, 6, 5, 4, 3, 2, 1, 0])
假設(shè)有一棟2層樓,每層樓內(nèi)的房間都是3排4列,那我們可以用一個三維數(shù)組來保存每個房間的居住人數(shù)(當(dāng)然,也可以是房間面積等其他數(shù)值信息)。
>>> a = np.arange(24).reshape(2,3,4) # 2層3排4列 >>> a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) >>> a[1][2][3] # 雖然可以這樣 23 >>> a[1,2,3] # 但這才是規(guī)范的用法 23 >>> a[:,0,0] # 所有樓層的第1排第1列 array([ 0, 12]) >>> a[0,:,:] # 1樓的所有房間,等價與a[0]或a[0,...] array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> a[:,:,1:3] # 所有樓層所有排的第2到4列 array([[[ 1, 2], [ 5, 6], [ 9, 10]], [[13, 14], [17, 18], [21, 22]]]) >>> a[1,:,-1] # 2層每一排的最后一個房間 array([15, 19, 23])
7、數(shù)組合并
數(shù)組合并除了下面介紹的水平合并、垂直合并、深度合并外,還有行合并、列合并,以及concatenate()等方式。假如你比我還懶,那就只了解前三種方法吧,足夠用了。
>>> a = np.arange(9).reshape(3,3) >>> b = np.arange(9,18).reshape(3,3) >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> b array([[ 9, 10, 11], [12, 13, 14], [15, 16, 17]]) >>> np.hstack((a,b)) # 水平合并 array([[ 0, 1, 2, 9, 10, 11], [ 3, 4, 5, 12, 13, 14], [ 6, 7, 8, 15, 16, 17]]) >>> np.vstack((a,b)) # 垂直合并 array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11], [12, 13, 14], [15, 16, 17]]) >>> np.dstack((a,b)) # 深度合并 array([[[ 0, 9], [ 1, 10], [ 2, 11]], [[ 3, 12], [ 4, 13], [ 5, 14]], [[ 6, 15], [ 7, 16], [ 8, 17]]])
8、數(shù)組拆分
拆分是合并的逆過程,概念是一樣的,但稍微有一點不同:
>>> a = np.arange(9).reshape(3,3) >>> np.hsplit(a, 3) # 水平拆分,返回list [array([[0], [3], [6]]), array([[1], [4], [7]]), array([[2], [5], [8]])] >>> np.vsplit(a, 3) # 垂直拆分,返回list [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])] >>> a = np.arange(27).reshape(3,3,3) >>> np.dsplit(a, 3) # 深度拆分,返回list [array([[[ 0], [ 3], [ 6]], [[ 9], [12], [15]], [[18], [21], [24]]]), array([[[ 1], [ 4], [ 7]], [[10], [13], [16]], [[19], [22], [25]]]), array([[[ 2], [ 5], [ 8]], [[11], [14], [17]], [[20], [23], [26]]])]
9、數(shù)組運算
數(shù)組和常數(shù)的四則運算,是數(shù)組的每一個元素分別和常數(shù)運算;數(shù)組和數(shù)組的四則運算則是兩個數(shù)組對應(yīng)元素的運算(兩個數(shù)組有相同的shape,否則拋出異常)。
>>> a = np.arange(4, dtype=np.float32).reshape(2,2) >>> b = np.arange(4, 8, dtype=np.float32).reshape(2,2) >>> a+2 # 數(shù)組和常數(shù)可以進行四則運算 array([[ 2., 3.], [ 4., 5.]], dtype=float32) >>> a/b # 數(shù)組和數(shù)組可以進行四則運算 array([[ 0. , 0.2 ], [ 0.33333334, 0.42857143]], dtype=float32) >>> a == b # 最神奇的是,數(shù)組可以判斷對應(yīng)元素是否相等 array([[False, False], [False, False]], dtype=bool) >>> (a == b).all() # 判斷數(shù)組是否相等 False
特別提示:如果想對數(shù)組內(nèi)符合特定條件的元素做特殊處理,下面的代碼也許有用。
>>> a = np.arange(6).reshape((2,3)) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> (a>2)&(a<=4) array([[False, False, False], [ True, True, False]], dtype=bool) >>> a[(a>2)&(a<=4)] array([3, 4]) >>> a[(a>2)&((a<=4))] += 10 >>> a array([[ 0, 1, 2], [13, 14, 5]])
10、數(shù)組方法和常用函數(shù)
數(shù)組對象本身提供了計算算數(shù)平均值、求大最小值等內(nèi)置方法,numpy也提供了很多實用的函數(shù)。為了縮減篇幅,下面的代碼僅以一維數(shù)組為例,展示了這些方法和函數(shù)用法。事實上,大多數(shù)情況下這些方法和函數(shù)對于多維數(shù)組同樣有效,只有少數(shù)例外,比如compress函數(shù)。
>>> a = np.array([3,2,4]) >>> a.sum() # 所有元素的和 9 >>> a.prod() # 所有元素的乘積 24 >>> a.mean() # 所有元素的算數(shù)平均值 3.0 >>> a.max() # 所有元素的大值 4 >>> a.min() # 所有元素的最小值 2 >>> a.clip(3,4) # 小于3的元素替換為3,大于4的元素替換為4 array([3, 3, 4]) >>> a.compress(a>2) # 返回大于2的元素組成的數(shù)組 array([3, 4]) >>> a.tolist() # 返回python的list [3, 2, 4] >>> a.var() # 計算方差(元素與均值之差的平方的均值) 0.66666666666666663 >>> a.std() # 計算標(biāo)準(zhǔn)差(方差的算術(shù)平方根) 0.81649658092772603 >>> a.ptp() # 返回數(shù)組的大值和最小值之差 2 >>> a.argmin() # 返回最小值在扁平數(shù)組中的索引 1 >>> a.argmax() # 返回大值在扁平數(shù)組中的索引 2 >>> np.where(a == 2) # 返回所有值為2的元素的索引 (array([1]),) >>> np.diff(a) # 返回相鄰元素的差 array([-1, 2]) >>> np.log(a) # 返回對數(shù)數(shù)組 array([ 1.09861229, 0.69314718, 1.38629436]) >>> np.exp(a) # 返回指數(shù)數(shù)組 array([ 20.08553692, 7.3890561 , 54.59815003]) >>> np.sqrt(a) # 返回開方數(shù)組 array([ 1.73205081, 1.41421356, 2. ]) >>> np.msort(a) # 數(shù)組排序 array([2, 3, 4]) >>> a = np.array([1,4,7]) >>> b = np.array([8,5,2]) >>> np.maximum(a, b) # 返回多個數(shù)組中對應(yīng)位置元素的大值數(shù)組 array([8, 5, 7]) >>> np.minimum(a, b) # 返回多個數(shù)組中對應(yīng)位置元素的最小值數(shù)組 array([1, 4, 2]) >>> np.true_divide(a, b) # 對整數(shù)實現(xiàn)真正的數(shù)學(xué)除法運算 array([ 0.125, 0.8 , 3.5 ])
二、矩陣對象
matrix是矩陣對象,繼承自ndarray類型,因此含有ndarray的所有數(shù)據(jù)屬性和方法。不過,當(dāng)你把矩陣對象當(dāng)數(shù)組操作時,需要注意以下幾點:
matrix對象總是二維的,即使是展平(ravel函數(shù))操作或是成員選擇,返回值也是二維的
matrix對象和ndarray對象混合的運算總是返回matrix對象
1、創(chuàng)建矩陣
matrix對象可以使用一個Matlab風(fēng)格的字符串來創(chuàng)建(以空格分隔列,以分號分隔行的字符串),也可以用數(shù)組來創(chuàng)建。
>>> np.mat('1 4 7; 2 5 8; 3 6 9') matrix([[1, 4, 7], [2, 5, 8], [3, 6, 9]]) >>> np.mat(np.arange(1,10).reshape(3,3)) matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
2、矩陣的特有屬性
矩陣有幾個特有的屬性使得計算更加容易,這些屬性有:
>>> m = np.mat(np.arange(1,10).reshape(3,3)) >>> m matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> m.T # 返回自身的轉(zhuǎn)置 matrix([[1, 4, 7], [2, 5, 8], [3, 6, 9]]) >>> m.H # 返回自身的共軛轉(zhuǎn)置 matrix([[1, 4, 7], [2, 5, 8], [3, 6, 9]]) >>> m.I # 返回自身的逆矩陣 matrix([[ -4.50359963e+15, 9.00719925e+15, -4.50359963e+15], [ 9.00719925e+15, -1.80143985e+16, 9.00719925e+15], [ -4.50359963e+15, 9.00719925e+15, -4.50359963e+15]]) >>> m.A # 返回自身數(shù)據(jù)的二維數(shù)組的一個視圖 array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
3、矩陣乘法
對ndarray對象而言,星號是按元素相乘,dot()函數(shù)則當(dāng)作矩陣相乘。對于matrix對象來說,星號和dot()函數(shù)都是矩陣相乘。特別的,對于一維數(shù)組,dot()函數(shù)實現(xiàn)的是向量點乘(結(jié)果是標(biāo)量),但星號實現(xiàn)的卻不是差乘。
>>> a = np.array([1,2,3]) >>> b = np.array([4,5,6]) >>> a*b # 一維數(shù)組,元素相乘 array([ 4, 10, 18]) >>> np.dot(a,b) # 一維數(shù)組,元素相乘再求和 32 >>> a = np.array([[1,2],[3,4]]) >>> b = np.array([[5,6],[7,8]]) >>> a*b # 多維數(shù)組,元素相乘 array([[ 5, 12], [21, 32]]) >>> np.dot(a,b) # 多維數(shù)組,實現(xiàn)的是矩陣相乘 array([[19, 22], [43, 50]]) >>> m = np.mat(a) >>> n = np.mat(b) >>> np.dot(m,n) # 矩陣相乘 matrix([[19, 22], [43, 50]]) >>> m*n # 矩陣相乘 matrix([[19, 22], [43, 50]])
三、線性代數(shù)模塊
numpy.linalg 是numpy的線性代數(shù)模塊,可以用來解決逆矩陣、特征值、線性方程組以及行列式等問題。
1、計算逆矩陣
盡管matrix對象本身有逆矩陣的屬性,但用numpy.linalg模塊求解矩陣的逆,也是非常簡單的。
m = np.mat('0 1 2; 1 0 3; 4 -3 8') mi = np.linalg.inv(m) # mi即為m的逆矩陣。何以證明? m * mi # 矩陣與其逆矩陣相乘,結(jié)果為單位矩陣 matrix([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]])
2、計算行列式
如何計算行列式,我早已經(jīng)不記得了,但手工計算行列式的痛苦,我依然記憶猶新?,F(xiàn)在好了,你在手機上都可以用numpy輕松搞定(前提是你的手機上安裝了python + numpy)。
m = np.mat('0 1 2; 1 0 3; 4 -3 8') np.linalg.det(m) # 什么?這就成了? 2.0
3、計算特征值和特征向量
m = np.mat('0 1 2; 1 0 3; 4 -3 8') >>> np.linalg.eigvals(m) # 計算特征值 array([ 7.96850246, -0.48548592, 0.51698346]) >>> np.linalg.eig(m) # 返回特征值及其對應(yīng)特征向量的元組 (array([ 7.96850246, -0.48548592, 0.51698346]), matrix([[ 0.26955165, 0.90772191, -0.74373492], [ 0.36874217, 0.24316331, -0.65468206], [ 0.88959042, -0.34192476, 0.13509171]]))
4、求解線性方程組
有線性方程組如下:
x - 2y + z = 0 2y -8z = 8 -4x + 5y + 9z = -9
求解過程如下:
>>> A = np.mat('1 -2 1; 0 2 -8; -4 5 9') >>> b = np.array([0, 8, -9]) >>> np.linalg.solve(A, b) array([ 29., 16., 3.]) # x = 29, y = 16, z = 3
以上就是Python中常用的數(shù)學(xué)建模Numpy,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。
分享名稱:Python中常用的數(shù)學(xué)建模Numpy-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://fisionsoft.com.cn/article/dcsope.html