您好,登錄后才能下訂單哦!
這篇文章主要介紹了Numpy如何實現(xiàn)矩陣運算及線性代數(shù)應用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
import numpy as np # 1直接創(chuàng)建 mat=np.mat("1 2 3;4 5 6;7 8 9") print(mat) # 2使用numpy數(shù)組創(chuàng)建矩陣 mat2=np.mat(np.arange(1,10).reshape(3,3)) print(mat2) # 3從已有的矩陣中通過bmat函數(shù)創(chuàng)建 A=np.eye(2) B=A*2 mat3=np.bmat("A B;B A") print(mat3) #類似于拼接
隨機函數(shù)1
隨機函數(shù)2*
mat1=np.mat(np.array([2,6,5])) mat2=np.mat(np.array([2,6,5]))
2.2.1加法—np.add
addresult=np.add(mat1,mat2) print(addresult)
2.2.2乘法—multiply
multiresult=np.multiply(mat1,mat2) print(multiresult) #數(shù)值的乘法 mat3=np.mat(np.arange(6).reshape(2,3)) mat4=np.mat(np.arange(6).reshape(3,2)) print("mat3*mat4\n",mat3*mat4)
2.2.3除法—divide
a=np.mat(np.array([4,5,8])) b=np.mat(np.array([2,3,5])) #########################除法 result1=np.divide(a,b) print(result1) #數(shù)組除法將結(jié)果向下去整 result2=np.floor_divide(a,b) print("除法向下去整:",result2) #矩陣直接相除 print("矩陣直接相除",a/b) #矩陣取模 print("矩陣取模",a%b) #返回小數(shù)部分 floatResult=np.true_divide(a,b) print(floatResult)
mat**2,要求mat為方陣,其平方為mat*mat的結(jié)果
mat1*mat2的結(jié)果為mat1(m,n)的行與mat2(n,p)的列乘積組成的新的矩陣(m,p)
2.2.4取模-mod/fmod
import numpy as np mat1=np.mat(np.array([5,-7,9])) mat2=np.mat(np.array([2,-4,3])) #取模運算 result1=np.remainder(mat1,mat2) print("remainder:",result1) result2=np.mod(mat1,mat2) print("mod",result2) result3=mat1%mat2 print("%",result3) result4=np.fmod(mat1,mat2) print(result4) #模 的正負和被除數(shù)相同,與除數(shù)無關
1一元函數(shù)(ufunc),只接受一個數(shù)組,結(jié)果返回一個結(jié)果數(shù)組,
當然也有返回兩個數(shù)組的(modf),但是情況很少。
2二元函數(shù)(binary),接受的是兩個結(jié)果,返回的是一個結(jié)果數(shù)組
3.1.1 圖表總說明
紅線圈出為常用函數(shù)
import numpy as np mat=np.mat(np.array([-10,5,-4,3,0,12])) print(np.abs(mat)) #絕對值 print(np.fabs(mat)) #非復數(shù)情況下
3.1.2獲取矩陣中各元素的正負—sign
#獲取矩陣中各元素的正負號 sign=np.sign(mat) print("sign:",sign) #sign: [[-1 1 -1 1 0 1]]
3.1.3整數(shù)小數(shù)的抽取分離—modf
#將數(shù)組中元素的小數(shù)和整數(shù)部分抽取出來 arr=np.array([[1.2,3.34], [-2.5,6.8]]) arr1,arr2=np.modf(arr) print("整數(shù)部分:",arr2) print("小數(shù)部分:",arr1)
3.2.1圖表總說明
紅線圈出為常用函數(shù)
3.2.2對應的矩陣的冪函數(shù)運算—power
mat2=np.mat(np.array([1,2,3,4])) mat3=np.mat(np.array([2,3,2,3])) result1=np.power(mat2,mat3) #mat2中元素作為底,mat3作為冪 print(result1)
3.2.3獲取兩個數(shù)組中對應元素的最大/小值,存放到新的數(shù)組中power()
import numpy as np mat3=np.mat(np.array([[1,2.2],[2,1.2]])) mat4=np.mat(np.array([[5,2.6],[2,3.2]])) result=np.power(mat1,mat2) print(result) >> [[ 1. 20.57737365] [ 6.76 1.79217324]] maximun=np.maximum(mat3,mat4) print(maximun) >> [[5. 2.6] [2. 3.2]]
3.2.4數(shù)組比較—greater
result2=np.greater(mat3,mat4) print(result2) >> [[False True] [ True False]] # 亦或 xor:相同的為False,不同的為True
3.2.5創(chuàng)建同結(jié)構(gòu)的數(shù)組—np.zeros_like()
import numpy as np a=np.arange(4).reshape(2,2) print(a) #創(chuàng)建一個和a類型一樣,但數(shù)據(jù)全是0的數(shù)組 like_a=np.zeros_like(a) like_a=3 #賦值 print(like_a) ################################################################################# #創(chuàng)建一個通用函數(shù)numpy def like(ndarry): result=np.zeros_like(ndarry) result.flat=5 return result #調(diào)用numpy創(chuàng)建通用函數(shù)的方法,1個輸入,一個輸出 myfunc=np.frompyfunc(like,1,1) test=myfunc(np.arange(9).reshape(3,3)) print(test) #結(jié)果如下: #[[array(5) array(5) array(5)] # [array(5) array(5) array(5)] # [array(5) array(5) array(5)]]
print("reduce:",np.add.reduce(a)) print("sum:",np.sum(a))
print("accumulate",np.add.accumulate(a))
print("reduceat",np.add.reduceat(a,[1,3,2,4])) # >> reduceat [3 3 5 4] #第一步用到索引值列表中的1和3,對數(shù)組中索引值在1到3之間的元素進行reduce操作 得到3; #第二步用到索引值3和2。由于2比3小,所以直接返回索引值為3的元素 得到3; #第三步用到索引值2和4。對索引值在2到4之間的數(shù)組元素進行reduce操作 得到4; #第四步用到索引值4。對索引值從7開始直到數(shù)組末端的元素進行reduce操作 得到5;
arr1=np.array([1,6]) arr2=np.array([2,3,5,65]) result2=np.add.outer(arr1,arr2) #相加 result3=np.outer(arr1,arr2) #相乘 print("outer:",result2) # outer 將第一個數(shù)組中的每個元素分別和第二個數(shù)組的所有元素相加
import numpy as np A=np.mat(np.array([[0,1,2],[1,0,3],[4,-3,8]])) #求A 的逆矩陣 A_=np.linalg.inv(A) print("A的逆矩陣:\n",A_) #驗證A*A_是否是單位矩陣 print("A*A_:\n",A*A_)
import numpy as np ''' X-2Y+Z=0 2Y-8Z=8 -4X+5Y+9Z=-9 ''' #求解三元一次函數(shù) A=np.mat("1 -2 1;0 2 -8;-4 5 9") print("系數(shù):",A) B=np.array([0,8,-9]) print("常數(shù):",B) #調(diào)用numpy的solve方法 result=np.linalg.solve(A,B) print("X={},Y={},Z={}".format(result[0],result[1],result[2]))
import numpy as np vector=np.mat("3 -2;1 0") #求特征值 eigenvalues=np.linalg.eigvals(vector) # 特征值是Ax=ax的根 eigenvalues,eigvector=np.linalg.eig(vector) print("特征值:",eigenvalues) print("特征向量:\n",eigvector) >>結(jié)果: 特征值: [2. 1.] 特征向量: [[0.89442719 0.70710678] [0.4472136 0.70710678]]
import numpy as np vector=np.mat("4 11 14;8 7 -2") #調(diào)用numpy匯總的svd方法對矩陣進行奇異值分解 U,sigma,V=np.linalg.svd(vector,full_matrices=False) print("U\n",U) print("sigma:\n",sigma) print("V:\n",V) #將svd分解出的值相乘 print("vector:\n",U*np.diag(sigma)*V)
對于一個n×n的實數(shù)矩陣,行列式描述的是一個線性變換對“有向體積”所造成的影響。行列式的值為正表示保持了空間的定向(順時針或逆時針),為負則表示顛倒了空間的定向。numpy.linalg模塊中的det函數(shù)可以計算矩陣的行列式。
import numpy as np vector=np.mat("3 4;5 6") print(vector) #求行列式 value=np.linalg.det(vector) print("行列式:",value)
6.1.1對數(shù)組元素進行排序
import numpy as np arr=np.array([1,2,34,5]) result=np.sort(arr) arr.sort() print(arr)
6.1.2返回排序后數(shù)組元素的索引—argsort()
argsort=np.argsort(arr) print("argsort:",argsort) d2=np.array([[12,3,45,2], [43,552,1,9]]) #將多維數(shù)組按列排序 d2.sort(axis=0) print(d2) #[[ 12 3 1 2] # [ 43 552 45 9]] #將多維數(shù)組按行排序 d2.sort(axis=1) print(d2)
6.1.3豎向索引排序
print(np.argsort(d2,axis=0)) [[0 0 0 0] [1 1 1 1]]
6.1.4橫向索引排序
print(np.argsort(d2,axis=1)) [[2 3 1 0] [3 0 2 1]]
6.2.1基本函數(shù)
6.2.2獲取最大值的下標—np.argmax()
import numpy as np a=np.array([[2,3,653,4], [5,62,943,44,]]) b=np.array([32,13,65,43]) #如果是多維數(shù)組,則將多維數(shù)組展平后獲取最大值的下標 argmax=np.argmax(a) print(argmax)
6.2.3非零元素獲取下標—np.argwhere()
#根據(jù)條件數(shù)組中搜索非零的元素,分析返回對應的下標 print("argwhere\n",np.argwhere(b>40)) print("argwhere 多維\n",np.argwhere(a>100)) ''' argwhere 多維 [[0 2] [1 2]] '''
6.2.4尋找合適的下標—np.searchsorted()
sorted=np.arange(5) indices=np.searchsorted(sorted,[-2,7]) print(indices) #下標
6.2.5添加符合的下標的元素,返回新的數(shù)組—np.searchsorted()
newsorted=np.insert(sorted,indices,[-2,7]) print("添加新元素后:\n",newsorted)
一維
import numpy as np a=np.arange(10) #生成一個抽取元素的花式索引 condition=a%2==0#賦值/算術/邏輯運算符優(yōu)先級 print("花式索引",condition) even=np.extract(condition,a) print("偶數(shù)項:",even) #take()/compress() even2=a.compress(condition)
多維強調(diào)內(nèi)容
import numpy as np #抽取數(shù)組中非零的元素np.nonzero() 的索引 arr=np.array([[0,1,2],[0,3,4],[0,5,6]]) rows,cols=np.nonzero(arr) print("rows",rows) print("cols:",cols) indices=np.dstack((rows,cols)) print("indices:\n",indices)
6.4.1 計算存款/貸款(終值)—fv函數(shù)
np.fv(rate,nper,pmt,pv,)
rate:存款/貸款每一期的利率
nper:總期數(shù)
pmt:存款/貸款支付的金額
pv:存款/貸款金額
rate=0.03/4
nper=5*4
pmt=-10
pv=-1000
import numpy as np #某用戶去銀行存款,假設年利率是3%,,每季度存10元, # 存5年以及存款1000,五年后可得到的本息和是多少? #g該用戶5年后得到的本息為 fv=np.fv(0.03/4,5*4,-10,-1000) print("5年后本息和:",fv) #計算每一年的本息和 for i in range(1,6): fv1=np.fv(0.03/4,i*4,-10,-1000) print("第",i,"年本息和為:{}".format(fv1))
6.4.2計算首月的金額(起始值)—pv函數(shù)
np.pv(rate, nper, pmt, pv, )
如果是貸款則是終值0
如果是貸款是本息和
import numpy as np #存五年可得1376.0963320407982,計算5年前存款的金額 pv=np.pv(0.03/4,5*4,-10,1376.0963320407982) print("5年錢第一次存款的金額是:",np.round(-pv))
6.4.3計算凈現(xiàn)值—npv函數(shù)
np.npv(rate,value)
rate:折現(xiàn)率
values:現(xiàn)金流
NPV>0,則除了得到預定的收益率外,可能得到更高的收益;
NPV<0,則未達到利益水平,但是不能確定自己是否虧損;
NPV=0, 正好達到預期的收益效果 ,不是盈虧平衡
#投資100,支出39,59,55,20,折現(xiàn)率28.1%,凈現(xiàn)值多大? npv=np.npv(0.281,[-100,39,59,55,20]) print("凈現(xiàn)值:",npv)
6.4.4計算每期還款金額—pmt函數(shù)
np.pmt(rate,nper,pv)
rate: 存款 / 貸款每一期的利率
nper:總期數(shù)
pv:需要還款的金額
#某人貸款20萬,15年還清,年利率是7.5%,求每月還的金額? pmt=np.pmt(0.075/12,15*12,200000) print("每月還款的金額:{}".format(pmt))
6.4.5計算還款期數(shù)—nper函數(shù)
np.nper(rate,pmt,pv,fv)
rate:存款/貸款每一期的利率
pmt:存款/貸款支付的金額
pv:存款/貸款金額
fv:總金額
#某人貸款20萬,每月還2000,年利率是7.5%,求多少年還完? nper=np.nper(0.075/12,-2000,200000) months=np.ceil(nper) years=np.ceil(months/12)#向上取整 print("需要還款{}年".format(years)) >>14年
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Numpy如何實現(xiàn)矩陣運算及線性代數(shù)應用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。