溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中常用的數(shù)學建模Numpy

發(fā)布時間:2020-09-10 16:59:08 來源:億速云 閱讀:167 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關Python中常用的數(shù)學建模Numpy,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

三劍客之Numpy

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

numpy不是python的標準庫,需要單獨安裝。假定你的運行環(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ù)組的形式無關。

下面的例子,創(chuàng)建了一個三維的數(shù)組(在導入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)和復數(shù)型(complex),每一種數(shù)據(jù)類型根據(jù)占用內(nèi)存的字節(jié)數(shù)又分為多個不同的子類型。常見的數(shù)據(jù)類型見下表。

Python中常用的數(shù)學建模Numpy

2、創(chuàng)建數(shù)組

通常,我們用np.array()創(chuàng)建數(shù)組。如果僅僅是創(chuàng)建一維數(shù)組,也可以使用np.arange()或者np.linspace()的方法。np.zeros()、np.ones()、np.eye()則可以構造特殊的數(shù)據(jù)。np.random.randint()和np.random.random()則可以構造隨機數(shù)數(shù)組。

>>> np.array([[1,2,3],[4,5,6]])                # 默認元素類型為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)                               # 默認元素類型為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、構造復雜數(shù)組

很多時候,我們需要從簡單的數(shù)據(jù)結構,構造出復雜的數(shù)組。例如,用一維的數(shù)據(jù)生成二維格點。

(1)重復數(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)重復元素: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ù)。構造虛數(shù)的方法如下:

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

4、數(shù)組的屬性

numpy的數(shù)組對象除了一些常規(guī)的屬性外,也有幾個類似轉置、扁平迭代器等看起來更像是方法的屬性。扁平迭代器也許是遍歷多維數(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ù)組
<numpy.flatiter object at 0x037188F0>
>>> 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()               # 行變列(類似于矩陣轉置)
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])

假設有一棟2層樓,每層樓內(nèi)的房間都是3排4列,那我們可以用一個三維數(shù)組來保存每個房間的居住人數(shù)(當然,也可以是房間面積等其他數(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ù)組對應元素的運算(兩個數(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ù)組可以判斷對應元素是否相等
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()                   # 計算標準差(方差的算術平方根)
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ù)組中對應位置元素的最大值數(shù)組
array([8, 5, 7])
>>> np.minimum(a, b)          # 返回多個數(shù)組中對應位置元素的最小值數(shù)組
array([1, 4, 2])
>>> np.true_divide(a, b)      # 對整數(shù)實現(xiàn)真正的數(shù)學除法運算
array([ 0.125,  0.8  ,  3.5  ])

二、矩陣對象

matrix是矩陣對象,繼承自ndarray類型,因此含有ndarray的所有數(shù)據(jù)屬性和方法。不過,當你把矩陣對象當數(shù)組操作時,需要注意以下幾點:

matrix對象總是二維的,即使是展平(ravel函數(shù))操作或是成員選擇,返回值也是二維的

matrix對象和ndarray對象混合的運算總是返回matrix對象

1、創(chuàng)建矩陣

matrix對象可以使用一個Matlab風格的字符串來創(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             # 返回自身的轉置
matrix([[1, 4, 7],
        [2, 5, 8],
        [3, 6, 9]])
>>> m.H             # 返回自身的共軛轉置
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ù)則當作矩陣相乘。對于matrix對象來說,星號和dot()函數(shù)都是矩陣相乘。特別的,對于一維數(shù)組,dot()函數(shù)實現(xiàn)的是向量點乘(結果是標量),但星號實現(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                          # 矩陣與其逆矩陣相乘,結果為單位矩陣
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)            # 返回特征值及其對應特征向量的元組
(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ù)學建模Numpy,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI