Numpy的矩阵运算及在线性代数中的应用

版权声明:本博客内容归个人所有,如需转载,请标明出处。 https://blog.csdn.net/m0_37468171/article/details/89855349

一、矩阵的创建和算术运算

矩阵的创建:

1、手动创建: mat(‘字符串’)
字符串格式:行与行之间用分号隔开;行内的元素之间用空格隔开。

A=np.mat('1 2 3;4 5 6; 7 8 9')

2、使用Numpy数组创建
1)使用mat(ndarray)函数创建矩阵(利用reshape函数)

B=np.mat(np.arange(1,10).reshape(3, 3))

2)利用mat(ndarray)函数创建矩阵,矩阵中存放随机数(numpy.random)

# 产生随机正态分布样本
C = np.mat(np.random.normal(size=(4,4)))
# 产生2行3列均匀分布随机数组
D = np.mat(np.random.rand(2,3))
# 三行三列正态分布随机数据
E = np.mat(np.random.randn(3,3))
# (1,100)以内的5行5列随机整数
F = np.mat(np.random.randint(1,100,[5,5]))
# (0,1)以内10个随机浮点数
G = np.mat(np.random.random(10))
# [0,10)内随机选择一个数
H = np.random.choice(10)

3)从已有矩阵创建新矩阵:利用bmat()函数创建矩阵(np.eye)

  • 先创建2个小矩阵
  • 再使用bmat函数复合
import numpy as np
A = np.eye(2)    
B = 2 * A
C = np.bmat('A B;A B;B A')

算术运算

add  # 将数组中对应的元素相加
subtract   # 从第一个数组中剪去第二个数组中的元素
multiply  # 数组元素相乘
divide、floor_divide  # 除法或向下取整除法(丢弃余数)

1)矩阵的除法运算

  • divide函数:做除法,整除
  • true_divide函数:返回除法的浮点数结果
  • floor_divide函数:做除法,进行向下取整并返回整数  使用/运算符相当于调用divide函数
  • 运算符//对应于floor_divide函数

2)模运算

  • remainder函数:逐个返回两个数组中元素相除后的余数
  • mod函数与remainder函数的功能完全一致
  • %操作符仅仅是remainder函数的简写
  • fmod函数所得余数的正负由被除数决定,与除数的正负无关

通用函数

1) 概念:通用函数(ufunc)是一种对ndarray中的数据执行元素级运算的函
数。你可以将其看作简单函数(接受一个或多个标量值,并产生一个或多 过标量值)的矢量化包装器。通用函数的输入是一组标量,输出也是一组 标量,它们通常可以对应于基本数学运算,如加、减、乘、除等。

2) 类别
通用函数(ufunc)有两种类别:

(1)一元(unary)ufunc,它们接受一个数组。返回一个结果数组,当然也 能返回两个数组(modf函数),但是这种的不是很常见;
在这里插入图片描述
(2)二元(binary)ufunc,它们接受两个数组,并返回一个结果数组。

在这里插入图片描述
(3) 创建通用函数

import numpy as np
# 定义一个函数
def ultimate_answer(a):
	result = np.zeros_like(a)  # 使用zeros_like函数创建一个和a形状相同, 并且元素全部为0的数组result
	result.flat = 42  # .flat 设置数组元素的值为42
	return result

# 使用 frompyfunc 创建通用函数
# 创建通用函数,1个输入,1个输出
ufunc = np.frompyfunc(ultimate_answer,1,1)

(4) numpy已有的通用函数的方法

  • accumulate
  • reduceat
  • outer
  • reduce
# reduce计算,功能是:等价于对矩阵元素求和.
a = np.arange(10)
np.add.reduce(a)

# accumulate计算,功能是:将存储运算的中间结果并返回
np.add.accumulate(a)

# reduceat计算,需要输入一个数组以及一个索引值列表作为参数
np.add.reduceat(a,[0,5,2,7])
#结果为:【10 5 20 15】 #第一步用到索引值列表中的0和5,对数组中索引值在0到5之间的元素进行reduce操作 得到10 #第二步用到索引值5和2。由于2比5小,所以直接返回索引值为5的元素 得到5 #第三步用到索引值2和7。对索引值在2到7之间的数组元素进行reduce操作 得到20 #第四步用到索引值7。对索引值从7开始直到数组末端的元素进行reduce操作 得到15

# outer计算:返回一个矩阵,将第一个矩阵的第一个元素与第二个 矩阵的每个元素求和返回一个矩阵,再将第一个矩阵的第二个元素与第 二个矩阵的每个元素求和返回一个矩阵
np.add.outer(np.add.outer(np.arange(1,4),a))

二、线性代数应用

numpy.linalg 模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。

计算逆矩阵

使用inv 函数计算逆矩阵:

import numpy as np
A = np.mat('0 1 2; 1 0 3;4 -3 8')
inverse = np.linalg.inv(A)

解线性方程组

使用solve函数计算线性方程组
在这里插入图片描述

import numpy as np
A = np.mat('1 -2 1;0 2 -8;-4 5 9')
b = np.array([0,8,-9])
C = np.linalg.solve(A,b)
print('x=',C[0],'y=',C[1],'z=',C[2])

特征值和特征向量

特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。其中,A 是一 个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的 向量。在numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而 eig函数可以返回一个包含特征值和对应的特征向量的元组。

import numpy as np
A = np.mat('3 -2;1 0')
eigenvalues, eigenvectors = np.linalg.eig(A)
print('特征值',eigenvalues,'特征向量',eigenvectors)

奇异值分解

SVD(Singular Value Decomposition,奇异值分解)是一种因 子分解运算,将一个矩阵分解为3个矩阵的乘积。在numpy.linalg模块 中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、 Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。(np.diag)

import numpy as np
A = np.mat('4 11 14;8 7 -2')
U,Sigma,V = np.linalg.svd(A,full_matrices=False)

计算矩阵的行列式

对于一个n×n的实数矩阵,行列式描述的是一个线性变换对“有向 体积”所造成的影响。行列式的值为正表示保持了空间的定向(顺时针 或逆时针),为负则表示颠倒了空间的定向。numpy.linalg模块中的 det函数可以计算矩阵的行列式。

import numpy as np
A = np.mat('3 4;5 6')
np.linalg.det(A)

三、专用函数

排序函数

1、ndarray类的sort方法——可对数组进行原地排序;
语法格式: list.sort([axis])
2、argsort函数——返回输入数组排序后的下标;
语法格式: np.argsort(a[, axis, kind, order])
3、sort函数——返回排序后的数组;
语法格式: np.sort(a[, axis, kind, order])

搜索函数

  • argmax函数——返回数组中最大值对应的下标
    语法格式: np.argmax(a)
  • nanargmax函数——与argmax提供相同的功能,但忽略NaN值
    语法格式: np.nanargmax(a)
  • argmin函数——返回数组中最小值对应的下标
    语法格式: np.argmin(a)
  • nanargmin函数——与argmin的功能类似,但忽略NaN值
    语法格式: np.nanargmin(a)
  • argwhere函数——根据条件搜索非零的元素,并分组返回对应的下标
    语法格式: np.argwhere(条件)
  • searchsorted函数——为指定的插入值寻找维持数组排序的索引位置。该函数使用二分 搜索算法
    语法格式: np. searchsorted(a,b)

数组元素抽取

  • 使用nonzero函数抽取数组中的非零元素
  • 使用extract函数基于生成的条件从数组中抽取元素

四、在金融方面的应用

  • fv函数——计算所谓的终值(future value),即基于一些假设给出的某个金融资 产在未来某一时间点的价值。
终值由以下4个参数决定——利率、期数、每期支付金额以及现值

语法格式如下: numpy.fv(rate, nper, pmt, pv[, when='end’])

#参数: 
rate:每一期的利率(rate of interest)。 
nper:期数。
pmt:payment。每期支付金额
pv:present value,现值。
when:{{‘begin’, 1}, {‘end’, 0}}, {string, int}, optional. 每一期的开头还是结尾付
  • pv函数——计算现值(present value),即金融资产当前的价值。
现值有以下4个参数决定——利率、期数、每期支付金额以及终值 
语法格式如下: numpy.fv(rate, nper, pmt, fv[, when='end’])
#参数: 
rate:每一期的利率(rate of interest)。
nper:期数。
pmt:payment。每期支付金额
fv: future value,终值。
when:{{‘begin’, 1}, {‘end’, 0}}, {string, int}, optional. 每一期的开头还是结尾付
  • npv函数——计算净现值(net present value),即按折现率计算的净现金流之和。
净现值是指投资方案所产生的【现金净流量】(流入-流出)以资金成本为贴现
率折现之后与原始投资额现值的差额经济意义

 NPV>0表示项目实施后,除保证可实现预定的收益率外,尚可获得更高的收益。 
 NPV<0表示项目实施后,未能达到预定的收益率水平,而不能确定项目已亏损。 
 NPV=0表示项目实施后的投资收益率正好达到预期,而不是投资项目盈亏平衡。
 
语法格式如下: numpy.npv(rate, values) 
#参数: 
rate:折现率。
values: 现金流,正数代表‘收入’或‘取款’,负数代表‘投资’或‘存款’。 第一个值 必须是初始的投资,也就是必须是负数
  • pmt函数——根据本金和利率计算每期需支付的金额。
语法格式如下: numpy.pmt(rate, nper, pv[, fv=0, when='end’]) 
#参数: 
rate:每一期的利率(rate of interest)
nper:期数
pv:present value,现值
  • nper函数——计算定期付款的期数。
语法格式如下: numpy.nper(rate, pmt, pv, fv=0, when='end') 
#参数: 
rate:每一期的利率(rate of interest)
pmt:每期支付的金额 pv:present value,现值 
fv: 终值
  • rate函数——计算利率(rate of interest)。
语法格式如下: numpy.rate(nper, pmt, pv, fv)
#参数: 
nper :需还的期数 
pmt:每期支付的金额
pv:present value,现值 
fv: 终值

猜你喜欢

转载自blog.csdn.net/m0_37468171/article/details/89855349