一、矩阵的创建和算术运算
矩阵的创建:
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: 终值