1. 程式人生 > >Numpy 使用教程--Numpy 數學函式及代數運算

Numpy 使用教程--Numpy 數學函式及代數運算

Numpy 使用教程–Numpy 數學函式及代數運算

一、實驗介紹

1.1 實驗內容

如果你使用 Python 語言進行科學計算,那麼一定會接觸到 Numpy。Numpy 是支援 Python 語言的數值計算擴充庫,其擁有強大的高維度陣列處理與矩陣運算能力。除此之外,Numpy 還內建了大量的函式,方便你快速構建數學模型。

1.2 實驗知識點

Numpy 數學函式
Numpy 代數運算
1.3 實驗環境

python2.7
Xfce 終端
ipython 終端
1.4 適合人群

本課程難度為一般,屬於初級級別課程,適合具有 Python 基礎,並對使用 Numpy 進行科學計算感興趣的使用者。

二、數學函式

使用 python 自帶的運算子,你可以完成數學中的加減乘除,以及取餘、取整,冪次計算等。匯入自帶的 math 模組之後,裡面又包含絕對值、階乘、開平方等一些常用的數學函式。不過,這些函式仍然相對基礎。如果要完成更加複雜一些的數學計算,就會顯得捉襟見肘了。

numpy 為我們提供了更多的數學函式,以幫助我們更好地完成一些數值計算。下面就依次來看一看。

2.1 三角函式

首先, 看一看 numpy 提供的三角函式功能。這些方法有:

numpy.sin(x):三角正弦。
numpy.cos(x):三角餘弦。
numpy.tan(x):三角正切。
numpy.arcsin(x):三角反正弦。
numpy.arccos(x):三角反餘弦。
numpy.arctan(x):三角反正切。
numpy.hypot(x1,x2):直角三角形求斜邊。
numpy.degrees(x):弧度轉換為度。
numpy.radians(x):度轉換為弧度。
numpy.deg2rad(x):度轉換為弧度。
numpy.rad2deg(x):弧度轉換為度。
比如,我們可以用上面提到的 numpy.rad2deg(x) 將弧度轉換為度。

import numpy as np

np.rad2deg(np.pi)
此處輸入圖片的描述

這些函式非常簡單,就不再一一舉例了。

2.2 雙曲函式

在數學中,雙曲函式是一類與常見的三角函式類似的函式。雙曲函式經常出現於某些重要的線性微分方程的解中,使用 numpy 計算它們的方法為:

numpy.sinh(x):雙曲正弦。
numpy.cosh(x):雙曲餘弦。
numpy.tanh(x):雙曲正切。
numpy.arcsinh(x):反雙曲正弦。
numpy.arccosh(x):反雙曲餘弦。
numpy.arctanh(x):反雙曲正切。
2.3 數值修約

數值修約, 又稱數字修約, 是指在進行具體的數字運算前, 按照一定的規則確定一致的位數, 然後捨去某些數字後面多餘的尾數的過程[via. 維基百科]。比如, 我們常聽到的「4 舍 5 入」就屬於數值修約中的一種。

numpy.around(a):平均到給定的小數位數。
numpy.round_(a):將陣列舍入到給定的小數位數。
numpy.rint(x):修約到最接近的整數。
numpy.fix(x, y):向 0 舍入到最接近的整數。
numpy.floor(x):返回輸入的底部(標量 x 的底部是最大的整數 i)。
numpy.ceil(x):返回輸入的上限(標量 x 的底部是最小的整數 i).
numpy.trunc(x):返回輸入的截斷值。
隨機選擇幾個浮點數,看一看上面方法的區別。

import numpy as np

a = np.array([1.21, 2.53, 3.86])
a
array([ 1.21, 2.53, 3.86])

np.around(a)
array([ 1., 3., 4.])

np.round_(a)
array([ 1., 3., 4.])

np.rint(a)
array([ 1., 3., 4.])

np.fix(a)
array([ 1., 2., 3.])

np.floor(a)
array([ 1., 2., 3.])

np.ceil(a)
array([ 2., 3., 4.])

np.trunc(a)
array([ 1., 2., 3.])
2.4 求和、求積、差分

下面這些方法用於陣列內元素或陣列間進行求和、求積以及進行差分。

numpy.prod(a, axis, dtype, keepdims):返回指定軸上的陣列元素的乘積。
numpy.sum(a, axis, dtype, keepdims):返回指定軸上的陣列元素的總和。
numpy.nanprod(a, axis, dtype, keepdims):返回指定軸上的陣列元素的乘積, 將 NaN 視作 1。
numpy.nansum(a, axis, dtype, keepdims):返回指定軸上的陣列元素的總和, 將 NaN 視作 0。
numpy.cumprod(a, axis, dtype):返回沿給定軸的元素的累積乘積。
numpy.cumsum(a, axis, dtype):返回沿給定軸的元素的累積總和。
numpy.nancumprod(a, axis, dtype):返回沿給定軸的元素的累積乘積, 將 NaN 視作 1。
numpy.nancumsum(a, axis, dtype):返回沿給定軸的元素的累積總和, 將 NaN 視作 0。
numpy.diff(a, n, axis):計算沿指定軸的第 n 個離散差分。
numpy.ediff1d(ary, to_end, to_begin):陣列的連續元素之間的差異。
numpy.gradient(f):返回 N 維陣列的梯度。
numpy.cross(a, b, axisa, axisb, axisc, axis):返回兩個(陣列)向量的叉積。
numpy.trapz(y, x, dx, axis):使用複合梯形規則沿給定軸積分。
下面,我們選取幾個舉例測試一下:

import numpy as np
a=np.arange(5)
a
array([0, 1, 2, 3, 4])

np.prod(a) # 所有元素乘積
0

np.sum(a) # 所有元素和
10

np.nanprod(a) # 預設軸上所有元素乘積
0

np.nansum(a) # 預設軸上所有元素和
10

np.cumprod(a) # 預設軸上元素的累積乘積。
array([0, 0, 0, 0, 0])

np.diff(a) # 預設軸上元素差分。
array([1, 1, 1, 1])
2.5 指數和對數

如果你需要進行指數或者對數求解,可以用到以下這些方法。

numpy.exp(x):計算輸入陣列中所有元素的指數。
numpy.expm1(x):對陣列中的所有元素計算 exp(x) - 1.
numpy.exp2(x):對於輸入陣列中的所有 p, 計算 2 ** p。
numpy.log(x):計算自然對數。
numpy.log10(x):計算常用對數。
numpy.log2(x):計算二進位制對數。
numpy.log1p(x):log(1 + x)。
numpy.logaddexp(x1, x2):log2(2**x1 + 2**x2)。
numpy.logaddexp2(x1, x2):log(exp(x1) + exp(x2))。
2.6 算術運算

當然,numpy 也提供了一些用於算術運算的方法,使用起來會比 python 提供的運算子靈活一些,主要是可以直接針對陣列。

numpy.add(x1, x2):對應元素相加。
numpy.reciprocal(x):求倒數 1/x。
numpy.negative(x):求對應負數。
numpy.multiply(x1, x2):求解乘法。
numpy.divide(x1, x2):相除 x1/x2。
numpy.power(x1, x2):類似於 x1^x2。
numpy.subtract(x1, x2):減法。
numpy.fmod(x1, x2):返回除法的元素餘項。
numpy.mod(x1, x2):返回餘項。
numpy.modf(x1):返回陣列的小數和整數部分。
numpy.remainder(x1, x2):返回除法餘數。

import numpy as np

a1 = np.random.randint(0, 10, 5)
a2 = np.random.randint(0, 10, 5)

a1
array([3, 7, 8, 0, 0])

a2
array([1, 8, 6, 4, 4])

np.add(a1, a2)
array([ 4, 15, 14, 4, 4])

np.reciprocal(a1)
array([0, 0, 0, , ])

np.negative(a1)
array([-3, -7, -8, 0, 0])

np.multiply(a1, a2)
array([ 3, 56, 48, 0, 0])

np.divide(a1, a2)
array([3, 0, 1, 0, 0])

np.power(a1, a2)
array([3,5764801,262144,0,0])

np.subtract(a1, a2)
array([ 2, -1, 2, -4, -4])

np.fmod(a1, a2)
array([0, 7, 2, 0, 0])

np.mod(a1, a2)
array([0, 7, 2, 0, 0])

np.modf(a1)
(array([ 0., 0., 0., 0., 0.]), array([ 3., 7., 8., 0., 0.]))

np.remainder(a1, a2)
array([0, 7, 2, 0, 0])

2.7 矩陣和向量積

求解向量、矩陣、張量的點積等同樣是 numpy 非常強大的地方。

numpy.dot(a,b):求解兩個陣列的點積。
numpy.vdot(a,b):求解兩個向量的點積。
numpy.inner(a,b):求解兩個陣列的內積。
numpy.outer(a,b):求解兩個向量的外積。
numpy.matmul(a,b):求解兩個陣列的矩陣乘積。
numpy.tensordot(a,b):求解張量點積。
numpy.kron(a,b):計算 Kronecker 乘積。
2.8 其他

除了上面這些歸好類別的方法,numpy 中還有一些用於數學運算的方法,歸納如下:

numpy.angle(z, deg):返回復引數的角度。
numpy.real(val):返回陣列元素的實部。
numpy.imag(val):返回陣列元素的虛部。
numpy.conj(x):按元素方式返回共軛複數。
numpy.convolve(a, v, mode):返回線性卷積。
numpy.sqrt(x):平方根。
numpy.cbrt(x):立方根。
numpy.square(x):平方。
numpy.absolute(x):絕對值, 可求解複數。
numpy.fabs(x):絕對值。
numpy.sign(x):符號函式。
numpy.maximum(x1, x2):最大值。
numpy.minimum(x1, x2):最小值。
numpy.nan_to_num(x):用 0 替換 NaN。
numpy.interp(x, xp, fp, left, right, period):線性插值。
三、代數運算

上面,我們分為 8 個類別,介紹了 numpy 中常用到的數學函式。這些方法讓複雜的計算過程表達更為簡單。除此之外,numpy 中還包含一些代數運算的方法,尤其是涉及到矩陣的計算方法,求解特徵值、特徵向量、逆矩陣等,非常方便。

numpy.linalg.cholesky(a):Cholesky 分解。
numpy.linalg.qr(a ,mode):計算矩陣的 QR 因式分解。
numpy.linalg.svd(a ,full_matrices,compute_uv):奇異值分解。
numpy.linalg.eig(a):計算正方形陣列的特徵值和右特徵向量。
numpy.linalg.eigh(a, UPLO):返回 Hermitian 或對稱矩陣的特徵值和特徵向量。
numpy.linalg.eigvals(a):計算矩陣的特徵值。
numpy.linalg.eigvalsh(a, UPLO):計算 Hermitian 或真實對稱矩陣的特徵值。
numpy.linalg.norm(x ,ord,axis,keepdims):計算矩陣或向量範數。
numpy.linalg.cond(x ,p):計算矩陣的條件數。
numpy.linalg.det(a):計算陣列的行列式。
numpy.linalg.matrix_rank(M ,tol):使用奇異值分解方法返回秩。
numpy.linalg.slogdet(a):計算陣列的行列式的符號和自然對數。
numpy.trace(a ,offset,axis1,axis2,dtype,out):沿陣列的對角線返回總和。
numpy.linalg.solve(a,b):求解線性矩陣方程或線性標量方程組。
numpy.linalg.tensorsolve(a,b ,axes):為 x 解出張量方程a x = b
numpy.linalg.lstsq(a,b ,rcond):將最小二乘解返回到線性矩陣方程。
numpy.linalg.inv(a):計算逆矩陣。
numpy.linalg.pinv(a ,rcond):計算矩陣的(Moore-Penrose)偽逆。
numpy.linalg.tensorinv(a ,ind):計算N維陣列的逆。
四、實驗總結

數學函式和代數運算方法是使用 numpy 進行數值計算中的利器,numpy 針對矩陣的高效率處理,往往可以達到事半功倍的效果。