<code>import
numpyas
np /<code>
線性代數
線性代數(如矩陣乘法、矩陣分解、行列式以及其他方陣數學等)是任何數組庫的重要組成部分。不像某些語言,通過 * 對兩個二維數組相乘得到的是一個元素級的積,而不是一個矩陣點積。因此,NumPy提供了一個用於矩陣乘法的dot函數(既是一個數組方法也是numpy命名空間中的一個函數):
In [2]:
<code>x = np.array([[1.,2.,3.],[4.,5.,6.]]
) y = np.array([[6.,23.],[-1,7],[8,9]]
) x /<code>
Out[2]:
<code>array([[1., 2., 3.], [4., 5., 6.]]
)/<code>
In [3]:
<code>y
/<code>
Out[3]:
<code>array([[ 6., 23.], [-1., 7.], [ 8., 9.]]
)/<code>
In [4]:
<code>x
.dot
(y
) /<code>
Out[4]:
<code>array([[ 28., 64.], [ 67., 181.]]
)/<code>
In [5]:
<code>np
.dot
(x
,y
) /<code>
Out[5]:
<code>array([[ 28., 64.], [ 67., 181.]]
)/<code>
一個二維數組跟一個大小合適的一維數組的矩陣點積運算之後將會得到一個一維數組:
In [8]:
<code>np
.dot
(x
,np
.ones
(3)) /<code>
Out[8]:
<code>array([
6
.,
15
.])
/<code>
In [10]:
<code>np
.dot
(y
,np
.ones
(2)) /<code>
Out[10]:
<code>array([29.,
6
.,
17
.])
/<code>
numpy.linalg中有一組標準的矩陣分解運算以及求逆和行列式之類的東西。它們跟其他數據統計語言所使用的是相同的行業標準級Fortran庫:
In [21]:
<code>from
numpy.linalg import inv,qr
X
=np.random.randn(5,5)
mat
=X.T.dot(X)
inv(mat)
/<code>
Out[21]:
<code>array([[
2.84983031
,
0.17028597
,
2.06756515
,
-0.66935204
,
-0.72098659
],
[
0.17028597
,
1.42661145
,
-0.53692364
,
-0.26180322
,
1.0091138
],
[
2.06756515
,
-0.53692364
,
2.11454618
,
-0.25328772
,
-1.24664562
],
[-0.66935204,
-0.26180322
,
-0.25328772
,
0.40703488
,
-0.15416442
],
[-0.72098659,
1.0091138
,
-1.24664562
,
-0.15416442
,
1.25974655
]])
/<code>
In [22]:
<code>mat
.dot
(inv
(mat
)) /<code>
Out[22]:
<code>array([[
1.00000000e+00
,
7.84262679e-16
,
5.68541151e-16
,
5.30052302e-17
,
1.89786553e-16
],
[
9.41383255e-16
,
1.00000000e+00
,
-2.45387387e-16
,
-1.53788812e-16
,
-2.64602775e-16
],
[
2.84351616e-15
,
1.06673485e-16
,
1.00000000e+00
,
5.29432642e-16
,
-1.43437516e-16
],
[-3.45062936e-15,
1.30806360e-15
,
-1.08754934e-15
,
1.00000000e+00
,
6.97169316e-16
],
[-1.13189072e-16,
2.33564351e-15
,
-1.36478095e-16
,
-9.00947159e-17
,
1.00000000e+00
]])
/<code>
In [23]:
<code>q
,r =qr(mat)
r /<code>
Out[23]:
<code>array([[-6.81664789,
0.89040141
,
8.38335228
,
-5.35686432
,
3.1113743
],
[
0
.
,
-5.65482912
,
6.94355581
,
6.13809956
,
12.75720191
],
[
0
.
,
0
.
,
-2.56251774
,
-4.50210436
,
-3.11283249
],
[
0
.
,
0
.
,
0
.
,
-1.1517615
,
0.06788782
],
[
0
.
,
0
.
,
0
.
,
0
.
,
0.46111917
]])
/<code>
diag 以一維數組的形式返回方陣的對角線(或非對角線)元素,或將一維數組轉換為方陣(非對角線元素為0)
In [28]:
<code>np
.diag
(x
) /<code>
Out[28]:
<code>array
([1.
,5.
])/<code>
trace 計算對角線元素的和
In [29]:
<code>np
.trace
(x
) /<code>
Out[29]:
<code>6.0
/<code>
det 計算矩陣行列式
from numpy.linalg import det arr = np.array([[1,2],[3,4]]) det(arr)
eig 計算方陣的本徵值和本徵向量
In [36]:
<code>np
.linalg
.eig
(arr
) /<code>
Out[36]:
<code>(array([-0.37228132
,5.37228132
]), array([[-0.82456484, -0.41597356], [ 0.56576746, -0.90937671]]
))/<code>
inv 計算方陣的逆
In [37]:
<code>np
.linalg
.inv
(arr
) /<code>
Out[37]:
<code>array([[-2. , 1. ], [ 1.5, -0.5]]
)/<code>
pinv 計算矩陣的Moore-Penrose偽逆
In [39]:
<code>np
.linalg
.pinv
(x
) /<code>
Out[39]:
<code>array([[-0.94444444, 0.44444444], [-0.11111111, 0.11111111], [ 0.72222222, -0.22222222]]
)/<code>
qr 計算QR分解
In [41]:
<code>np.linalg.qr(x.dot(y)
) /<code>
Out[41]:
<code>(array([[-0.385593 , -0.92266897], [-0.92266897, 0.385593 ]]
), array([[ -72.61542536, -191.68103652], [ 0. , 10.7415194 ]]
))/<code>
svd 計算奇異值分解(SVD)
In [43]:
<code>np
.linalg
.svd
(x
.dot
(y
)) /<code>
Out[43]:
<code>(array([[-0.3399534 , -0.94044228], [-0.94044228, 0.3399534 ]]
), array([205.22074464
,3.80078535
]), array([[-0.35341616, -0.9354662 ], [-0.9354662 , 0.35341616]]
))/<code>
solve 解線性方程組Ax=b,其中A為一個方陣
In [52]:
<code>np
.linalg
.solve
(arr
,np
.array
([6,8]
)) /<code>
Out[52]:
<code>array
([-4.
,5.
])/<code>
lstsq 計算Ax=b的最小二乘解
In [72]:
<code>x
=
np.array([0,
1
,
2
,
3
])
y
=
np.array([1,
1
,
1
,
3.1
])
A
=
np.vstack([x,
np.ones(len(x))]).T
m,
c
=
np.linalg.lstsq(A,
x,
rcond=None)[0]
/<code>
In [73]:
<code>import
matplotlib.pyplotas
plt _ = plt.plot(x, y,'o'
, label='Original data'
, markersize=10
) _ = plt.plot(x, m*x + c,'r'
, label='Fitted Line'
) _ = plt.legend() plt.show() /<code>