• 售前

  • 售后

热门帖子
入门百科

Numpy实现矩阵运算及线性代数应用

[复制链接]
枫夜渔火火f 显示全部楼层 发表于 2021-10-26 12:38:24 |阅读模式 打印 上一主题 下一主题
目次


  • 一、创建矩阵的方法
  • 二、矩阵运算

    • 2.1随机函数表

  • 2.2部分实例
  • 三、通用函数

    • 3.1 一元通用函数

  • 3.2二元通用函数
  • 四、矩阵运算-add运算

    • 4.1矩阵元素求和—reduce
    • 4.2矩阵元素求和列出—accumulate
    • 4.3reduceat函数
    • 4.4各个矩阵元素相加—outer

  • 五、线性代数的应用

    • 5.1 逆矩阵—np.linalg.inv()
    • 5.2计算矩阵—np.linalg.solve(arr1,arr2)
    • 5.3 特征值和特征向量
    • 5.4奇异值分解—np.linalg.svd()
    • 5.5矩阵行列式—np.linalg.det()

  • 六、专用函数

    • 6.1排序
    • 6.2搜索函数
    • 6.3抽取函数—extract(condition,ndarray)
    • 6.4金融函数


一、创建矩阵的方法
  1. import numpy as np
  2. # 1直接创建
  3. mat=np.mat("1 2 3;4 5 6;7 8 9")
  4. print(mat)
  5. # 2使用numpy数组创建矩阵
  6. mat2=np.mat(np.arange(1,10).reshape(3,3))
  7. print(mat2)
  8. # 3从已有的矩阵中通过bmat函数创建
  9. A=np.eye(2)
  10. B=A*2
  11. mat3=np.bmat("A B;B A")
  12. print(mat3) #类似于拼接
复制代码
二、矩阵运算


2.1随机函数表


随机函数1



随机函数2*


2.2部分实例
  1. mat1=np.mat(np.array([2,6,5]))
  2. mat2=np.mat(np.array([2,6,5]))
复制代码
2.2.1加法—np.add
  1. addresult=np.add(mat1,mat2)
  2. print(addresult)
复制代码
2.2.2乘法—multiply
  1. multiresult=np.multiply(mat1,mat2)
  2. print(multiresult) #数值的乘法
  3. mat3=np.mat(np.arange(6).reshape(2,3))
  4. mat4=np.mat(np.arange(6).reshape(3,2))
  5. print("mat3*mat4\n",mat3*mat4)
复制代码
2.2.3除法—divide
  1. a=np.mat(np.array([4,5,8]))
  2. b=np.mat(np.array([2,3,5]))
  3. #########################除法
  4. result1=np.divide(a,b)
  5. print(result1)
  6. #数组除法将结果向下去整
  7. result2=np.floor_divide(a,b)
  8. print("除法向下去整:",result2)
  9. #矩阵直接相除
  10. print("矩阵直接相除",a/b)
  11. #矩阵取模
  12. print("矩阵取模",a%b)
  13. #返回小数部分
  14. floatResult=np.true_divide(a,b)
  15. print(floatResult)
复制代码
  1. <em>mat**2,要求mat为方阵,其平方为mat*mat的结果</em>
  2. <em>mat1*mat2的结果为mat1(m,n)的行与mat2(n,p)的列乘积组成的新的矩阵(m,p)</em>
复制代码
2.2.4取模-mod/fmod
  1. import numpy as np
  2. mat1=np.mat(np.array([5,-7,9]))
  3. mat2=np.mat(np.array([2,-4,3]))
  4. #取模运算
  5. result1=np.remainder(mat1,mat2)
  6. print("remainder:",result1)
  7. result2=np.mod(mat1,mat2)
  8. print("mod",result2)
  9. result3=mat1%mat2
  10. print("%",result3)
  11. result4=np.fmod(mat1,mat2)
  12. print(result4) #模 的正负和被除数相同,与除数无关
复制代码
三、通用函数
  1. 1一元函数(ufunc),只接受一个数组,结果返回一个结果数组,
  2. 当然也有返回两个数组的(modf),但是情况很少。
  3. 2二元函数(binary),接受的是两个结果,返回的是一个结果数组
复制代码
3.1 一元通用函数

3.1.1 图表总阐明


红线圈出为常用函数
  1. import numpy as np
  2. mat=np.mat(np.array([-10,5,-4,3,0,12]))
  3. print(np.abs(mat)) #绝对值
  4. print(np.fabs(mat)) #非复数情况下
复制代码
3.1.2获取矩阵中各元素的正负—sign
  1. #获取矩阵中各元素的正负号
  2. sign=np.sign(mat)
  3. print("sign:",sign)
  4. #sign: [[-1 1 -1 1 0 1]]
复制代码
3.1.3整数小数的抽取分离—modf
  1. #将数组中元素的小数和整数部分抽取出来
  2. arr=np.array([[1.2,3.34],
  3.     [-2.5,6.8]])
  4. arr1,arr2=np.modf(arr)
  5. print("整数部分:",arr2)
  6. print("小数部分:",arr1)
复制代码
3.2二元通用函数

3.2.1图表总阐明


红线圈出为常用函数

3.2.2对应的矩阵的幂函数运算—power
  1. mat2=np.mat(np.array([1,2,3,4]))
  2. mat3=np.mat(np.array([2,3,2,3]))
  3. result1=np.power(mat2,mat3) #mat2中元素作为底,mat3作为幂
  4. print(result1)
复制代码
3.2.3获取两个数组中对应元素的最大/小值,存放到新的数组中power()
  1. import numpy as np
  2. mat3=np.mat(np.array([[1,2.2],[2,1.2]]))
  3. mat4=np.mat(np.array([[5,2.6],[2,3.2]]))
  4. result=np.power(mat1,mat2)
  5. print(result) >> [[ 1.   20.57737365] [ 6.76  1.79217324]]
  6. maximun=np.maximum(mat3,mat4)
  7. print(maximun) >> [[5. 2.6] [2. 3.2]]
复制代码
3.2.4数组比较—greater
  1. result2=np.greater(mat3,mat4)
  2. print(result2) >> [[False True] [ True False]]
  3. # 亦或 xor:相同的为False,不同的为True
复制代码
3.2.5创建同结构的数组—np.zeros_like()
  1. import numpy as np
  2. a=np.arange(4).reshape(2,2)
  3. print(a)
  4. #创建一个和a类型一样,但数据全是0的数组
  5. like_a=np.zeros_like(a)
  6. like_a=3 #赋值
  7. print(like_a)
  8. #################################################################################
  9. #创建一个通用函数numpy
  10. def like(ndarry):
  11. result=np.zeros_like(ndarry)
  12. result.flat=5
  13. return result
  14. #调用numpy创建通用函数的方法,1个输入,一个输出
  15. myfunc=np.frompyfunc(like,1,1)
  16. test=myfunc(np.arange(9).reshape(3,3))
  17. print(test)
  18. #结果如下:
  19. #[[array(5) array(5) array(5)]
  20. # [array(5) array(5) array(5)]
  21. # [array(5) array(5) array(5)]]
复制代码
四、矩阵运算-add运算


4.1矩阵元素求和—reduce
  1. print("reduce:",np.add.reduce(a))
  2. print("sum:",np.sum(a))
复制代码
4.2矩阵元素求和列出—accumulate
  1. print("accumulate",np.add.accumulate(a))
复制代码
4.3reduceat函数
  1. print("reduceat",np.add.reduceat(a,[1,3,2,4])) # >> reduceat [3 3 5 4]
  2. #第一步用到索引值列表中的1和3,对数组中索引值在1到3之间的元素进行reduce操作 得到3;
  3. #第二步用到索引值3和2。由于2比3小,所以直接返回索引值为3的元素 得到3;
  4. #第三步用到索引值2和4。对索引值在2到4之间的数组元素进行reduce操作 得到4;
  5. #第四步用到索引值4。对索引值从7开始直到数组末端的元素进行reduce操作 得到5;
复制代码
4.4各个矩阵元素相加—outer
  1. arr1=np.array([1,6])
  2. arr2=np.array([2,3,5,65])
  3. result2=np.add.outer(arr1,arr2) #相加
  4. result3=np.outer(arr1,arr2)  #相乘
  5. print("outer:",result2)
  6. # outer 将第一个数组中的每个元素分别和第二个数组的所有元素相加
复制代码
五、线性代数的应用


5.1 逆矩阵—np.linalg.inv()
  1. import numpy as np
  2. A=np.mat(np.array([[0,1,2],[1,0,3],[4,-3,8]]))
  3. #求A 的逆矩阵
  4. A_=np.linalg.inv(A)
  5. print("A的逆矩阵:\n",A_)
  6. #验证A*A_是否是单位矩阵
  7. print("A*A_:\n",A*A_)
复制代码
5.2计算矩阵—np.linalg.solve(arr1,arr2)
  1. import numpy as np
  2. '''
  3. X-2Y+Z=0
  4. 2Y-8Z=8
  5. -4X+5Y+9Z=-9
  6. '''
  7. #求解三元一次函数
  8. A=np.mat("1 -2 1;0 2 -8;-4 5 9")
  9. print("系数:",A)
  10. B=np.array([0,8,-9])
  11. print("常数:",B)
  12. #调用numpy的solve方法
  13. result=np.linalg.solve(A,B)
  14. print("X={},Y={},Z={}".format(result[0],result[1],result[2]))
复制代码
5.3 特征值和特征向量
  1. import numpy as np
  2. vector=np.mat("3 -2;1 0")
  3. #求特征值
  4. eigenvalues=np.linalg.eigvals(vector)
  5. # 特征值是Ax=ax的根
  6. eigenvalues,eigvector=np.linalg.eig(vector)
  7. print("特征值:",eigenvalues)
  8. print("特征向量:\n",eigvector)
  9. >>结果:
  10. 特征值: [2. 1.]
  11. 特征向量:
  12. [[0.89442719 0.70710678]
  13. [0.4472136 0.70710678]]
复制代码
5.4奇异值分解—np.linalg.svd()
  1. import numpy as np
  2. vector=np.mat("4 11 14;8 7 -2")
  3. #调用numpy汇总的svd方法对矩阵进行奇异值分解
  4. U,sigma,V=np.linalg.svd(vector,full_matrices=False)
  5. print("U\n",U)
  6. print("sigma:\n",sigma)
  7. print("V:\n",V)
  8. #将svd分解出的值相乘
  9. print("vector:\n",U*np.diag(sigma)*V)
复制代码
5.5矩阵行列式—np.linalg.det()
  1. 对于一个n×n的实数矩阵,行列式描述的是一个线性变换对“有向体积”所造成的影响。行列式的值为正表示保持了空间的定向(顺时针或逆时针),为负则表示颠倒了空间的定向。numpy.linalg模块中的det函数可以计算矩阵的行列式。
复制代码
  1. import numpy as np
  2. vector=np.mat("3 4;5 6")
  3. print(vector)
  4. #求行列式
  5. value=np.linalg.det(vector)
  6. print("行列式:",value)
复制代码
六、专用函数


6.1排序

6.1.1对数组元素举行排序
  1. import numpy as np
  2. arr=np.array([1,2,34,5])
  3. result=np.sort(arr)
  4. arr.sort()
  5. print(arr)
复制代码
6.1.2返回排序后数组元素的索引—argsort()
  1. argsort=np.argsort(arr)
  2. print("argsort:",argsort)
  3. d2=np.array([[12,3,45,2],
  4.     [43,552,1,9]])
  5. #将多维数组按列排序
  6. d2.sort(axis=0)
  7. print(d2)
  8. #[[ 12 3 1 2]
  9. # [ 43 552 45 9]]
  10. #将多维数组按行排序
  11. d2.sort(axis=1)
  12. print(d2)
复制代码
6.1.3竖向索引排序
  1. print(np.argsort(d2,axis=0))
  2. [[0 0 0 0]
  3. [1 1 1 1]]
复制代码
6.1.4横向索引排序
  1. print(np.argsort(d2,axis=1))
  2. [[2 3 1 0]
  3. [3 0 2 1]]
复制代码
6.2搜索函数

6.2.1根本函数

6.2.2获取最大值的下标—np.argmax()
  1. import numpy as np
  2. a=np.array([[2,3,653,4],
  3.    [5,62,943,44,]])
  4. b=np.array([32,13,65,43])
  5. #如果是多维数组,则将多维数组展平后获取最大值的下标
  6. argmax=np.argmax(a)
  7. print(argmax)
复制代码
6.2.3非零元素获取下标—np.argwhere()
  1. #根据条件数组中搜索非零的元素,分析返回对应的下标
  2. print("argwhere\n",np.argwhere(b>40))
  3. print("argwhere 多维\n",np.argwhere(a>100))
  4. '''
  5. argwhere 多维
  6. [[0 2]
  7. [1 2]]
  8. '''
复制代码
6.2.4寻找合适的下标—np.searchsorted()
  1. sorted=np.arange(5)
  2. indices=np.searchsorted(sorted,[-2,7])
  3. print(indices)      #下标
复制代码
6.2.5添加符合的下标的元素,返回新的数组—np.searchsorted()
  1. newsorted=np.insert(sorted,indices,[-2,7])
  2. print("添加新元素后:\n",newsorted)
复制代码
6.3抽取函数—extract(condition,ndarray)

一维
  1. import numpy as np
  2. a=np.arange(10)
  3. #生成一个抽取元素的花式索引
  4. condition=a%2==0#赋值/算术/逻辑运算符优先级
  5. print("花式索引",condition)
  6. even=np.extract(condition,a)
  7. print("偶数项:",even)
  8. #take()/compress()
  9. even2=a.compress(condition)
复制代码
多维夸大内容
  1. import numpy as np
  2. #抽取数组中非零的元素np.nonzero() 的索引
  3. arr=np.array([[0,1,2],[0,3,4],[0,5,6]])
  4. rows,cols=np.nonzero(arr)
  5. print("rows",rows)
  6. print("cols:",cols)
  7. indices=np.dstack((rows,cols))
  8. print("indices:\n",indices)
复制代码
6.4金融函数

6.4.1 计算存款/贷款(终值)—fv函数


  1. np.fv(rate,nper,pmt,pv,)
  2. rate:存款/贷款每一期的利率
  3. nper:总期数
  4. pmt:存款/贷款支付的金额
  5. pv:存款/贷款金额
  6. rate=0.03/4
  7. nper=5*4
  8. pmt=-10
  9. pv=-1000
复制代码
  1. import numpy as np
  2. #某用户去银行存款,假设年利率是3%,,每季度存10元,
  3. # 存5年以及存款1000,五年后可得到的本息和是多少?
  4. #g该用户5年后得到的本息为
  5. fv=np.fv(0.03/4,5*4,-10,-1000)
  6. print("5年后本息和:",fv)
  7. #计算每一年的本息和
  8. for i in range(1,6):
  9. fv1=np.fv(0.03/4,i*4,-10,-1000)
  10. print("第",i,"年本息和为:{}".format(fv1))
复制代码
6.4.2计算首月的金额(起始值)—pv函数
  1. np.pv(rate, nper, pmt, pv, )
  2. 如果是贷款则是终值0
  3. 如果是贷款是本息和
复制代码
  1. import numpy as np
  2. #存五年可得1376.0963320407982,计算5年前存款的金额
  3. pv=np.pv(0.03/4,5*4,-10,1376.0963320407982)
  4. print("5年钱第一次存款的金额是:",np.round(-pv))
复制代码
6.4.3计算净现值—npv函数
  1. np.npv(rate,value)
  2. rate:折现率
  3. values:现金流
  4. NPV>0,则除了得到预定的收益率外,可能得到更高的收益;
  5. NPV<0,则未达到利益水平,但是不能确定自己是否亏损;
  6. NPV=0, 正好达到预期的收益效果 ,不是盈亏平衡
复制代码
  1. #投资100,支出39,59,55,20,折现率28.1%,净现值多大?
  2. npv=np.npv(0.281,[-100,39,59,55,20])
  3. print("净现值:",npv)
复制代码
6.4.4计算每期还款金额—pmt函数
  1. np.pmt(rate,nper,pv)
  2. rate: 存款 / 贷款每一期的利率
  3. nper:总期数
  4. pv:需要还款的金额
复制代码
  1. #某人贷款20万,15年还清,年利率是7.5%,求每月还的金额?
  2. pmt=np.pmt(0.075/12,15*12,200000)
  3. print("每月还款的金额:{}".format(pmt))
复制代码
6.4.5计算还款期数—nper函数
  1. np.nper(rate,pmt,pv,fv)
  2. rate:存款/贷款每一期的利率
  3. pmt:存款/贷款支付的金额
  4. pv:存款/贷款金额
  5. fv:总金额
复制代码
  1. #某人贷款20万,每月还2000,年利率是7.5%,求多少年还完?
  2. nper=np.nper(0.075/12,-2000,200000)
  3. months=np.ceil(nper)
  4. years=np.ceil(months/12)#向上取整
  5. print("需要还款{}年".format(years)) >>14年
复制代码
到此这篇关于Numpy实现矩阵运算及线性代数应用的文章就先容到这了,更多干系Numpy 矩阵运算及线性代数内容请搜索脚本之家以前的文章或继承浏览下面的干系文章盼望大家以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作