SciPy是使用優(yōu)化的ATLAS LAPACK和BLAS庫構(gòu)建的。 它具有非??斓木€性代數(shù)能力。 所有這些線性代數(shù)例程都需要一個可以轉(zhuǎn)換為二維數(shù)組的對象。 這些例程的輸出也是一個二維數(shù)組。
SciPy.linalg與NumPy.linalg
scipy.linalg包含numpy.linalg中的所有函數(shù)。 另外,scipy.linalg還有一些不在numpy.linalg中的高級函數(shù)。 在numpy.linalg上使用scipy.linalg的另一個優(yōu)點是它總是用BLAS/LAPACK支持編譯,而對于NumPy,這是可選的。 因此,根據(jù)NumPy的安裝方式,SciPy版本可能會更快。
scipy.linalg.solve特征為未知的x,y值求解線性方程a * x + b * y = Z。
作為一個例子,假設(shè)需要解下面的聯(lián)立方程。
要求解x,y,z值的上述方程式,可以使用矩陣求逆來求解向量,如下所示。
但是,最好使用linalg.solve命令,該命令可以更快,更穩(wěn)定。
求解函數(shù)采用兩個輸入'a'和'b',其中'a'表示系數(shù),'b'表示相應(yīng)的右側(cè)值并返回解矩陣。
現(xiàn)在來看看下面的例子。
#importing the scipy and numpy packages
from scipy import linalg
import numpy as np
#Declaring the numpy arrays
a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])
b = np.array([2, 4, -1])
#Passing the values to the solve function
x = linalg.solve(a, b)
#printing the result array
print (x)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 2. -2. 9.]
方陣A的行列式通常表示為| A |并且是線性代數(shù)中經(jīng)常使用的量。 在SciPy中,這是使用det()函數(shù)計算的。 它將矩陣作為輸入并返回一個標(biāo)量值。
下面來看看一個例子。
#importing the scipy and numpy packages
from scipy import linalg
import numpy as np
#Declaring the numpy array
A = np.array([[1,2],[3,4]])
#Passing the values to the det function
x = linalg.det(A)
#printing the result
print (x)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
-2.0
特征值 - 特征向量問題是最常用的線性代數(shù)運算之一。 我們可以通過考慮以下關(guān)系式來找到方陣(A)的特征值(λ)和相應(yīng)的特征向量(v)
Av = λv
scipy.linalg.eig從普通或廣義特征值問題計算特征值。 該函數(shù)返回特征值和特征向量。
讓我們來看看下面的例子。
#importing the scipy and numpy packages
from scipy import linalg
import numpy as np
#Declaring the numpy array
A = np.array([[1,2],[3,4]])
#Passing the values to the eig function
l, v = linalg.eig(A)
#printing the result for eigen values
print (l)
#printing the result for eigen vectors
print (v)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[-0.37228132+0.j 5.37228132+0.j]
[[-0.82456484 -0.41597356]
[ 0.56576746 -0.90937671]]
奇異值分解(SVD)可以被認為是特征值問題擴展到非矩陣的矩陣。
scipy.linalg.svd將矩陣'a'分解為兩個酉矩陣'U'和'Vh',以及一個奇異值(實數(shù),非負)的一維數(shù)組's',使得a == U * S * Vh,其中'S'是具有主對角線's'的適當(dāng)形狀的零點矩陣。
讓我們來看看下面的例子。參考以下代碼 -
#importing the scipy and numpy packages
from scipy import linalg
import numpy as np
#Declaring the numpy array
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)
#Passing the values to the eig function
U, s, Vh = linalg.svd(a)
# printing the result
print (U, Vh, s)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[[-0.60142679+0.28212127j 0.35719830-0.03260559j 0.61548126-0.22632383j]
[-0.00477296+0.44250532j 0.64058557+0.15734719j -0.40414313+0.45357092j]
[ 0.46360086+0.38462177j -0.18611686+0.6337182j 0.44311251+0.06747886j]] [[ 0.98724353+0.j -0.01113675+0.15882756j]
[-0.15921753+0.j -0.06905445+0.9848255j ]] [ 2.04228408 1.33798044]