numpy
Linjär algebra med n.linalg
Sök…
Anmärkningar
Från version 1.8 kan flera av rutinerna i np.linalg
fungera på en "stack" med matriser. Det vill säga rutinen kan beräkna resultat för flera matriser om de staplas ihop. Till exempel tolkas A
här som två staplade 3-för-3-matriser:
np.random.seed(123)
A = np.random.rand(2,3,3)
b = np.random.rand(2,3)
x = np.linalg.solve(A, b)
print np.dot(A[0,:,:], x[0,:])
# array([ 0.53155137, 0.53182759, 0.63440096])
print b[0,:]
# array([ 0.53155137, 0.53182759, 0.63440096])
De officiella np
dokumenten anger detta via parameterspecifikationer som a : (..., M, M) array_like
.
Lös linjära system med n.solve
Tänk på följande tre ekvationer:
x0 + 2 * x1 + x2 = 4
x1 + x2 = 3
x0 + x2 = 5
Vi kan uttrycka detta system som en matrisekvation A * x = b
med:
A = np.array([[1, 2, 1],
[0, 1, 1],
[1, 0, 1]])
b = np.array([4, 3, 5])
np.linalg.solve
att lösa för x
:
x = np.linalg.solve(A, b)
# Out: x = array([ 1.5, -0.5, 3.5])
A
måste vara en kvadratisk matris med full rang: Alla rader måste vara linjärt oberoende. A
bör vara inverterbar / icke-singular (dess bestämning är inte noll). Till exempel, om en rad A
är en multipel av en annan, kommer att ringa linalg.solve
att höja LinAlgError: Singular matrix
:
A = np.array([[1, 2, 1],
[2, 4, 2], # Note that this row 2 * the first row
[1, 0, 1]])
b = np.array([4,8,5])
Sådana system kan lösas med np.linalg.lstsq
.
Hitta den minsta kvadratlösningen på ett linjärt system med np.linalg.lstsq
Minst kvadrater är en standardmetod för problem med fler ekvationer än okända, även känd som överbestämda system.
Tänk på de fyra ekvationerna:
x0 + 2 * x1 + x2 = 4
x0 + x1 + 2 * x2 = 3
2 * x0 + x1 + x2 = 5
x0 + x1 + x2 = 4
Vi kan uttrycka detta som en matrismultiplikation A * x = b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([4,3,5,4])
np.linalg.lstsq
med np.linalg.lstsq
:
x, residuals, rank, s = np.linalg.lstsq(A,b)
x
är lösningen, residuals
summan, rank
matrisrangen för ingång A
och s
singulärvärdena för A
Om b
har mer än en dimension, kommer lstsq
att lösa systemet som motsvarar varje kolumn i b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([[4,3,5,4],[1,2,3,4]]).T # transpose to align dimensions
x, residuals, rank, s = np.linalg.lstsq(A,b)
print x # columns of x are solutions corresponding to columns of b
#[[ 2.05263158 1.63157895]
# [ 1.05263158 -0.36842105]
# [ 0.05263158 0.63157895]]
print residuals # also one for each column in b
#[ 0.84210526 5.26315789]
rank
och s
beror bara på A
, och är därmed desamma som ovan.