新聞中心

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)章貢,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575
三劍客之Numpy
numpy是一個(gè)開(kāi)源的python科學(xué)計(jì)算庫(kù),包含了很多實(shí)用的數(shù)學(xué)函數(shù),涵蓋線性代數(shù)、傅里葉變換和隨機(jī)數(shù)生成等功能。最初的numpy其實(shí)是scipy的一部分,后來(lái)才從scipy中分離出來(lái)。
numpy不是python的標(biāo)準(zhǔn)庫(kù),需要單獨(dú)安裝。假定你的運(yùn)行環(huán)境已經(jīng)安裝了python包管理工具pip,numpy的安裝就非常簡(jiǎn)單:
pip install numpy
一、數(shù)組對(duì)象
ndarray是多維數(shù)組對(duì)象,也是numpy最核心的對(duì)象。在numpy中,數(shù)組的維度(dimensions)叫做軸(axes),軸的個(gè)數(shù)叫做秩(rank)。通常,一個(gè)numpy數(shù)組的所有元素都是同一種類型的數(shù)據(jù),而這些數(shù)據(jù)的存儲(chǔ)和數(shù)組的形式無(wú)關(guān)。
下面的例子,創(chuàng)建了一個(gè)三維的數(shù)組(在導(dǎo)入numpy時(shí),一般都簡(jiǎn)寫(xiě)成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)、浮點(diǎn)型(float)和復(fù)數(shù)型(complex),每一種數(shù)據(jù)類型根據(jù)占用內(nèi)存的字節(jié)數(shù)又分為多個(gè)不同的子類型。常見(jiàn)的數(shù)據(jù)類型見(jiàn)下表。
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)造隨機(jī)數(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個(gè)浮點(diǎn)數(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) # 主對(duì)角線元素為1其他元素為0 array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>> np.random.random((2,3)) # 生成[0,1)之間的隨機(jī)浮點(diǎn)數(shù) array([[ 0.84731148, 0.8222318 , 0.85799278], [ 0.59371558, 0.92330741, 0.04518351]]) >>> np.random.randint(0,10,(3,2)) # 生成[0,10)之間的隨機(jī)整數(shù) array([[2, 4], [8, 3], [8, 5]])
3、構(gòu)造復(fù)雜數(shù)組
很多時(shí)候,我們需要從簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),構(gòu)造出復(fù)雜的數(shù)組。例如,用一維的數(shù)據(jù)生成二維格點(diǎn)。
(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ù)組對(duì)象除了一些常規(guī)的屬性外,也有幾個(gè)類似轉(zhuǎn)置、扁平迭代器等看起來(lái)更像是方法的屬性。扁平迭代器也許是遍歷多維數(shù)組的一個(gè)簡(jiǎn)明方法,下面的代碼給出了一個(gè)例子。
>>> 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ù)組元素個(gè)數(shù)
6
>>> a.T # 數(shù)組行變列,類似于transpose()
array([[1, 4],
[2, 5],
[3, 6]])
>>> a.flat # 返回一個(gè)扁平迭代器,用于遍歷多維數(shù)組
>>> for item in a.flat:
print item
5、改變數(shù)組維度
numpy數(shù)組的存儲(chǔ)順序和數(shù)組的維度是不相干的,因此改變數(shù)組的維度是非常便捷的操作,除resize()外,這一類操作不會(huì)改變所操作的數(shù)組本身的存儲(chǔ)順序。
>>> 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,但會(huì)改變所操作的數(shù)組 >>> a array([[1, 2], [3, 4], [5, 6]])
6、索引和切片
對(duì)于一維數(shù)組的索引和切片,numpy和python的list一樣,甚至更靈活。
a = np.arange(9) >>> a[-1] # 最后一個(gè)元素 8 >>> a[2:5] # 返回第2到第5個(gè)元素 array([2, 3, 4]) >>> a[:7:3] # 返回第0到第7個(gè)元素,步長(zhǎng)為3 array([0, 3, 6]) >>> a[::-1] # 返回逆序的數(shù)組 array([8, 7, 6, 5, 4, 3, 2, 1, 0])
假設(shè)有一棟2層樓,每層樓內(nèi)的房間都是3排4列,那我們可以用一個(gè)三維數(shù)組來(lái)保存每個(gè)房間的居住人數(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樓的所有房間,等價(jià)與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層每一排的最后一個(gè)房間 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ù)組拆分
拆分是合并的逆過(guò)程,概念是一樣的,但稍微有一點(diǎn)不同:
>>> 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ù)組運(yùn)算
數(shù)組和常數(shù)的四則運(yùn)算,是數(shù)組的每一個(gè)元素分別和常數(shù)運(yùn)算;數(shù)組和數(shù)組的四則運(yùn)算則是兩個(gè)數(shù)組對(duì)應(yīng)元素的運(yùn)算(兩個(gè)數(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ù)可以進(jìn)行四則運(yùn)算 array([[ 2., 3.], [ 4., 5.]], dtype=float32) >>> a/b # 數(shù)組和數(shù)組可以進(jìn)行四則運(yùn)算 array([[ 0. , 0.2 ], [ 0.33333334, 0.42857143]], dtype=float32) >>> a == b # 最神奇的是,數(shù)組可以判斷對(duì)應(yīng)元素是否相等 array([[False, False], [False, False]], dtype=bool) >>> (a == b).all() # 判斷數(shù)組是否相等 False
特別提示:如果想對(duì)數(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ù)組對(duì)象本身提供了計(jì)算算數(shù)平均值、求最小值等內(nèi)置方法,numpy也提供了很多實(shí)用的函數(shù)。為了縮減篇幅,下面的代碼僅以一維數(shù)組為例,展示了這些方法和函數(shù)用法。事實(shí)上,大多數(shù)情況下這些方法和函數(shù)對(duì)于多維數(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() # 計(jì)算方差(元素與均值之差的平方的均值) 0.66666666666666663 >>> a.std() # 計(jì)算標(biāo)準(zhǔn)差(方差的算術(shù)平方根) 0.81649658092772603 >>> a.ptp() # 返回?cái)?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) # 返回對(duì)數(shù)數(shù)組 array([ 1.09861229, 0.69314718, 1.38629436]) >>> np.exp(a) # 返回指數(shù)數(shù)組 array([ 20.08553692, 7.3890561 , 54.59815003]) >>> np.sqrt(a) # 返回開(kāi)方數(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) # 返回多個(gè)數(shù)組中對(duì)應(yīng)位置元素的值數(shù)組 array([8, 5, 7]) >>> np.minimum(a, b) # 返回多個(gè)數(shù)組中對(duì)應(yīng)位置元素的最小值數(shù)組 array([1, 4, 2]) >>> np.true_divide(a, b) # 對(duì)整數(shù)實(shí)現(xiàn)真正的數(shù)學(xué)除法運(yùn)算 array([ 0.125, 0.8 , 3.5 ])
二、矩陣對(duì)象
matrix是矩陣對(duì)象,繼承自ndarray類型,因此含有ndarray的所有數(shù)據(jù)屬性和方法。不過(guò),當(dāng)你把矩陣對(duì)象當(dāng)數(shù)組操作時(shí),需要注意以下幾點(diǎn):
matrix對(duì)象總是二維的,即使是展平(ravel函數(shù))操作或是成員選擇,返回值也是二維的
matrix對(duì)象和ndarray對(duì)象混合的運(yùn)算總是返回matrix對(duì)象
1、創(chuàng)建矩陣
matrix對(duì)象可以使用一個(gè)Matlab風(fēng)格的字符串來(lái)創(chuàng)建(以空格分隔列,以分號(hào)分隔行的字符串),也可以用數(shù)組來(lái)創(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、矩陣的特有屬性
矩陣有幾個(gè)特有的屬性使得計(jì)算更加容易,這些屬性有:
>>> 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ù)組的一個(gè)視圖 array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
3、矩陣乘法
對(duì)ndarray對(duì)象而言,星號(hào)是按元素相乘,dot()函數(shù)則當(dāng)作矩陣相乘。對(duì)于matrix對(duì)象來(lái)說(shuō),星號(hào)和dot()函數(shù)都是矩陣相乘。特別的,對(duì)于一維數(shù)組,dot()函數(shù)實(shí)現(xiàn)的是向量點(diǎn)乘(結(jié)果是標(biāo)量),但星號(hào)實(shí)現(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ù)組,實(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ù)模塊,可以用來(lái)解決逆矩陣、特征值、線性方程組以及行列式等問(wèn)題。
1、計(jì)算逆矩陣
盡管matrix對(duì)象本身有逆矩陣的屬性,但用numpy.linalg模塊求解矩陣的逆,也是非常簡(jiǎn)單的。
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ì)算行列式
如何計(jì)算行列式,我早已經(jīng)不記得了,但手工計(jì)算行列式的痛苦,我依然記憶猶新?,F(xiàn)在好了,你在手機(jī)上都可以用numpy輕松搞定(前提是你的手機(jī)上安裝了python + numpy)。
m = np.mat('0 1 2; 1 0 3; 4 -3 8')
np.linalg.det(m) # 什么?這就成了?
2.0
3、計(jì)算特征值和特征向量
m = np.mat('0 1 2; 1 0 3; 4 -3 8')
>>> np.linalg.eigvals(m) # 計(jì)算特征值
array([ 7.96850246, -0.48548592, 0.51698346])
>>> np.linalg.eig(m) # 返回特征值及其對(duì)應(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
求解過(guò)程如下:
>>> 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創(chuàng)新互聯(lián)教程,大量的免費(fèi)python視頻教程,歡迎在線學(xué)習(xí)!
相關(guān)推薦:
1、Python數(shù)學(xué)建模三劍客之Matplotlib
2、Python數(shù)學(xué)建模三劍客之Scipy
本文標(biāo)題:創(chuàng)新互聯(lián)Python教程:Python數(shù)學(xué)建模三劍客之Numpy
分享地址:http://fisionsoft.com.cn/article/cccscgo.html


咨詢
建站咨詢
