Numpy矩阵的创建与运算
标签(空格分隔): 未分类
'''--------------------numpy矩阵的创建-----------------------'''
import numpy as np
#numpy矩阵创建的方法
# 1.直接使用分号隔开的字符串
mat1 = np.mat("1 2 3;4 5 6;7 8 9")
print(mat1) #<class 'numpy.matrixlib.defmatrix.matrix'>
print(type(mat1))
# 2.使用numpy数组创建矩阵
arr = np.arange(1,10).reshape(3,3)
# print(type(arr)) #<class 'numpy.ndarray'>
# print(arr)
mat2 = np.mat(arr)
print(mat2)
# print(type(mat2)) #<class 'numpy.matrixlib.defmatrix.matrix'>
# 3.从已有的矩阵中通过bmat函数复合创建矩阵
A = np.eye(2)
B = A*2
mat3 = np.bmat("A B;B A;A B")
print(mat3)
print(mat3.shape) #(6, 4)
'''--------------------numpy随机矩阵的创建-----------------------'''
import numpy as np
from matplotlib import pyplot as plt
#创建一个服从正太分布的随机矩阵
normal = np.random.normal(size=100)
print(normal)
#打印直方图
# plt.hist(normal)
# plt.show()
#创建一个服从beta分布的随机样本
beta = np.random.beta(a=.5,b=.5,size=100)
# plt.hist(beta)
# plt.show()
#产生均匀分布的随机数
rand = np.random.rand(3,2,4) #三层两行四列
print(rand)
#产生4x4随机正太分布样本
normal2 = np.random.normal(size=(100,100))
print("normal2-100x100:\n",normal2)
plt.hist(normal2)
plt.show()
#产生在某个范围内的随机整数矩阵
numbers = np.mat(np.random.randint(1,50,[5,5]))
# print(numbers)
#产生0-1之间随机浮点数
floatNum = np.mat(np.random.random(10)) #产生10个0-1的浮点数
print(floatNum)
#在某个范围内的所有数中随机抽取一个
num = np.random.choice(10) #[0,10)内随机选一个数
print(num)
num1 = np.random.choice(5,10) #[0,5)内随机选10个数
print(num1)
'''--------------------numpy矩阵的运算add/multiply/*-----------------------'''
import numpy as np
mat1 = np.mat(np.array([2,6,5]))
mat2 = np.mat(np.array([1,4,7]))
#矩阵的加法
addResult = np.add(mat1,mat2)
print(type(addResult)) #<class 'numpy.matrixlib.defmatrix.matrix'>
print(addResult) #[[ 3 10 12]]
#数组的乘法
multiResult = np.multiply(mat1,mat2)
print(multiResult) #[[ 2 24 35]]
#矩阵相乘 mxp矩阵乘以pxn矩阵,相乘后得mxn矩阵
mat3 = np.mat(np.arange(6).reshape(2,3))
mat4 = np.mat(np.arange(6).reshape(3,2))
print("矩阵相乘mat3*mat4=\n",mat3*mat4)
'''-------------numpy矩阵的运算divide/floor_divide/mod/remainder/fmod-------------'''
import numpy as np
a = np.mat(np.array([4,5,8]))
b = np.mat(np.array([2,3,5]))
#数组的除法
result = np.divide(a,b)
print("数组相除:",result)
print("直接数组相除:",a/b)
#数组除法并将结果向下取整
result2 = np.floor_divide(a,b)
print("相除向下取整:",result2)
print("相除向下取整:",a//b)
#矩阵取模运算/求余数
result3 = np.remainder(a,b)
print("remainder结果:",result3)
result4 = np.mod(a,b)
print("mod结果:",result4)
print("取模运算:",a%b)
result5 = np.fmod(a,b) #所得余数的正负由被除数决定,与除数的正负无关
print("fmod结果:",result5)
#矩阵相除,python2.7和3的结果还不一致,python3里true_divide与divide结果一样
floatResult = np.true_divide(a,b)
print("true_divide:",floatResult)
'''----------------numpy一元通用函数-----------------'''
import numpy as np
mat = np.mat(np.array([-4,3,0,12]))
print("abs:",np.abs(mat)) #[[ 4 3 0 12]]
print("fabs:",np.fabs(mat)) #[[ 4. 3. 0. 12.]]
#获取mat矩阵中各元素的正负号
sign = np.sign(mat)
print("sign:",sign) #[[-1 1 0 1]]
#将数组中元素的小数和整数部分抽取出来
arr = np.mat(np.array([[1.2,3.14],
[-2.5,6.8]]))
arr1,arr2 = np.modf(arr)
print("小数部分:",arr1) #[[ 0.2 0.14] [-0.5 0.8 ]]
print("整数部分:",arr2) #[[ 1. 3.] [-2. 6.]]
#求平方根
C = np.mat(np.arange(1,6))
print("平方根:",np.sqrt(C))
#求平方
D = np.mat(np.arange(-3,2))
print("平方:",np.square(D))
#取整
E = np.mat(np.array([[2.3,4.6],[1.2,1.9]]))
print("ceil:",np.ceil(E))
print("floor:",np.floor(E))
print("rint:",np.rint(E))
'''----------------numpy创建通用函数-----------------'''
import numpy as np
a = np.arange(4).reshape(2,2)
print("a",a) #[[0 1] [2 3]]
like_a = np.zeros_like(a)
print("like_a-1",like_a) #[[0 0] [0 0]]
like_a.flat = 42
print("like_a-2:",like_a) #[[42 42] [42 42]]
#创建一个numpy通用函数
def like(ndarray):
result = np.zeros_like(ndarray)
result = 42 #result.flat = 42
return result
#调用numpy创建通用函数的方法
myfunc = np.frompyfunc(like,1,1) #1 个输入, 1 个输出
test = myfunc(np.arange(9).reshape(3,3))
print("test:",test) #[[42 42 42] [42 42 42] [42 42 42]]
'''-------------------二元通用函数-------------------'''
import numpy as np
#power
mat = np.mat(np.array([1,2,3,4,5]))
I = np.mat(np.array([2,3,2,1,3]))
print("mat power I:",np.power(mat,I)) #power: [[ 1 8 9 4 125]]
print("I power mat:",np.power(I,mat)) #power: [[ 2 9 8 1 243]]
#获取两个数组对应元素的最大值和最小值,返回到至一个新的数组中
d2 = np.array([[22,15],
[5.4,6.6]])
d3 = np.array([[15,28],
[7.9,4.0]])
# maximum = np.maximum(d2,d3)
# print("maxinum:",maximum) #[[22. 28. ],[ 7.9 6.6]]
# minimum = np.minimum(d2,d3)
# print("minimum:",minimum) #[[15. 15. ],[ 5.4 4. ]]
#数组比较函数
result = np.greater(d2,d3)
print("greater:",result) #[[ True False], [False True]]
result1 = np.greater_equal(d2,d3)
print("greater_equal:",result1) #[[ True False], [False True]]
#python转换为bool为False:0 None "" {} [] () False
bool1 = np.array([[1,0],[3,5]])
bool2 = np.array([[0,1],[12,0]])
bool3 = np.logical_and(bool1,bool2)
print("逻辑与:",bool3) #[[False False] [ True False]]
bool4 = np.logical_xor(bool1,bool2)
print("逻辑异或:",bool4) #[[ True True] [False True]]
bool5 = np.logical_or(bool1,bool2)
print("逻辑或:",bool5) # [[ True True] [ True True]]
'''-------------------np.add模块下的通用函数-------------------'''
import numpy as np
#np.add模块下面的通用函数
a = np.arange(9)
print("a=",a)
#reduce求和
print("reduce(a)=",np.add.reduce(a))
print("sum(a)=",np.sum(a))
#accumulate 依次将数组元素相加的每一步结果保存到一个新数组
print("accumulate(a)=",np.add.accumulate(a))
#reduceat,根据给定区间分段进行reduce求和操作
print("reduceat=",np.add.reduceat(a,[0,5,2,7])) #reduceat= [10 5 20 15]
#上面求的应该是[0,5)之间的和,因为5>2,就去5,再求[2,7)之间和,再求[7:)后面的求和
#outer,将第一个数组中额每个元素分别和第二个数组中的所有元素求和
print("outer=",np.add.outer(np.arange(1,4),a))
'''-------------------矩阵求逆np.linalg.inv()-------------------'''
import numpy as np
A = np.mat(np.array([[0,1,2],
[1,0,3],
[4,-3,8]]))
print("A:\n",A)
#求A矩阵的逆矩阵
A_ = np.linalg.inv(A)
print("A的逆矩阵:\n",A_)
#验证A*A_的结果是否是一个单位矩阵
print("A*A_:\n",A*A_)
'''----------------矩阵求解方程组np.linalg.solve()-------------------'''
import numpy as np
'''
x − 2y + z = 0
2y - 8z = 8
−4�� + 5�� + 9�� = −9
'''
#numpy求解三元一次方程组
A = np.mat("1 -2 1;0 2 -8;-4 5 9")
print("方程组的系数:\n",A)
b = np.array([0,8,-9]) #不能用矩阵表示
print("方程组的常数:\n",b)
#调用numpy的solve方法求解
C = np.linalg.solve(A,b)
print("x={},y={},z={}".format(C[0],C[1],C[2]))
'''-------------------矩阵求特征值和特征向量np.linalg.eigvals()/np.linalg.eig()-------------------'''
import numpy as np
vector = np.mat("3 -2;1 0")
print(vector)
#求向量的特征值
eigenvalues = np.linalg.eigvals(vector)
print("向量的特征值:",eigenvalues)
#同时求向量的特征值和特征向量
eigenvalues,eigvector = np.linalg.eig(vector)
print("特征值:",eigenvalues)
print("特征向量:",eigvector)
'''-------------------矩阵奇异值分解np.linalg.svd()-------------------'''
import numpy as np
vector = np.mat("4 11 14;8 7 -2")
print("vector\n",vector)
#调用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)
'''-------------------矩阵的行列式np.linalg.det()-------------------'''
import numpy as np
vector = np.mat("3 4;5 6")
print(vector)
#求矩阵的行列式
value = np.linalg.det(vector)
print("矩阵的行列式的值:",value)
'''-------------------数组的排序函数np.argsort()/sort()-------------------'''
#二维数组排序
d2 = np.array([[12,8,35],
[22,45,9]])
d2.sort(axis=0) #按列排序
print("当axis=0时排序:",d2)
d2.sort(axis=1) #按行排序
print("当axis=1时排序:",d2)
# 2.返回排序后数组元素的索引
argsort = np.argsort(arr)
print("argsort:",argsort)
#将多维数组按列排序后返回列索引
print(np.argsort(d2,axis=0))
#将多维数组按行降序排序后返回行索引
print(np.argsort(-d2,axis=1))
'''-------------------搜索函数np.searchsorted()-------------------'''
import numpy as np
a = np.array([[12,56,-34],
[18,200,6]])
b = np.array([34,22,34,67,11,90,20])
#获取数组中元素最大值的下标,如果是多维数组,则展平后输出最大值的下标
argmax = np.argmax(a)
print(argmax) #4 将二维数组展平后输出最大值的索引
print(np.argmax(b)) #5
#根据条件在数组中搜索非零元素,并分组返回对应的下标
print("argwhere:\n",np.argwhere(b>20)) #[[0][1][2][3][5]]
print("argwhere:\n",np.argwhere(a>40)) # [[0 1] [1 1]]
#searchsort为需要添加到数组中的元素寻找合适的下标,
#使得原数组的排序顺序不变
sorted =np.arange(5)
print("添加新元素之前:",sorted) #[0 1 2 3 4]
indices = np.searchsorted(sorted,[-2,7])
print("寻找到的插入位置下标:",indices) #[0 5]
#根据寻找到的下标,将元素添加到数组中,返回新的数组
result = np.insert(sorted,indices,[-2,7])
print("新数组:",result) #[-2 0 1 2 3 4 7]
'''-----------------专有函数np.nonzero/np.extract----------------'''
import numpy as np
#提取数组中的非零元素索引np.nonzero()
arr = np.array([[0,1,2],
[0,3,4],
[0,5,6]])
rows,cols = np.nonzero(arr)
print("数组中的非零元素的行索引:",rows)
print("数组中的非零元素的列索引:",cols)
#利用深度组合将行列索引合并
indices = np.dstack((rows,cols))
print("数组中的非零元素的索引:",indices)
----------------------------------------
import numpy as np
a = np.arange(10)
#生成一个抽取数组元素花式索引
condition = a%2 ==0 #赋值运算符,算术运算符,逻辑运算符优先级
print("花式索引",condition) #[ True False True False True False True False True False]
#np.extract()根据给定条件提取数组元素
even = np.extract(condition,a)
print("数组中的偶数项:",even) #[0 2 4 6 8]
#用数组的compress方法提取元素
even2 = a.compress(condition)
print("even2:",even2) #[0 2 4 6 8]
#用np.take函数结合np.where实现提取偶数项
indices = np.where(a%2 ==0)
print("偶数项元素的索引:",indices) #(array([0, 2, 4, 6, 8], dtype=int64),)
print("even3:",np.take(a,indices)) #[[0 2 4 6 8]]
'''-------------------------金融函数-------------------------'''
import numpy as np
#fv函数
'''
np.fv(rate,nper,pmt,pv)
rate:存款/贷款每期的利率
nper:存款/贷款期数
pmt:存款/贷款每期支付的金额
pv:存款/贷款金额,如果是贷款,pv为正,如果是存款,pv为负;
01举例:某用户去银行存款,假设年利率3%、每季度续存金额 10元、
存5年以及存款1000,则计算5年后可领取多少金额
'''
#该用户5年能够得到的本息和为:
print("Future vlue",np.fv(0.03/12,5*12,-10/3,-1000)) #按每月计算
print("Future vlue",np.fv(0.03/4,5*4,-10,-1000)) #按每季度计算
#计算每一年过后能得到的本息和
fvals = []
for year in range(1,6):
fvals.append(np.fv(0.03/12,year*12,-10/3,-1000))
print("第{}年后本息和为:{}".format(year,fvals))
'''
np.pv(rate,nper,pmt,fv)
rate:存款/贷款每期的利率
nper:存款/贷款期数
pmt:存款/贷款每期支付的金额
fv:存款/贷款终值,如何是贷款,终值为0,如果是存款终值为本息和
02举例::某用户去银行存款,假设年利率3%、每季度续存金额10 元、
存5年后可领1376.0963320,则计算5年前存取的本金是多少金额。
'''
pv = np.pv(0.03/12,5*12,-10/3,1376.09)
print("第一次存款金额为:",-pv)
'''
np.npv(rate,values)
rate:折现率
values:现金流,正数代表‘收入’或‘取款’,负数代表‘投资’或‘存款’。
第一个值必须是初始的投资,也就是必须是负数
03举例:投资100,收入39、59、55、20。折现率为28.1%,则净现值为多少?
'''
#现金流:0-100,39-0,59-0,55-0,20-0
npv = np.npv(0.281,[-100,39,59,55,20])
print("净现值为:",npv)
'''
np.pmt(rate,nper,pv)
rate:存款/贷款每期的利率
nper:存款/贷款期数
pmt:存款/贷款每期支付的金额
pv:存款/贷款金额,如果是贷款,pv为正,如果是存款,pv为负;
04举例:某同学房贷20万,准备15年还清,年利率为7.5%,则每 月需还贷多少金额?
'''
pmt = np.pmt(0.075/12,15*12,200000)
print("每期需要还款:{}元".format(pmt))
'''
np.nper(rate,pmt,pv)
rate:存款/贷款每期的利率
nper:存款/贷款期数
pmt:存款/贷款每期支付的金额
pv:存款/贷款金额,如果是贷款,pv为正,如果是存款,pv为负;
05举例:某同学房贷20万,年利率为7.5%,每月能还贷2000,则 需要还多少期?
'''
months = np.ceil(np.nper(0.075/12,-2000,200000))
print("需要还款{}月".format(months))
#月转化为年
years = np.ceil(months/12)
print("需要还款{}年".format(years))
'''
np.rate(nper,pmt,pv,fv)
rate:存款/贷款每期的利率
nper:存款/贷款期数
pmt:存款/贷款每期支付的金额
pv:存款/贷款金额,如果是贷款,pv为正,如果是存款,pv为负;
fv:终值
06举例:某同学房贷20万,需还14年,每月能还贷2000,则年利率为多少?
'''
rate = 12* np.rate(14*12,-2000,200000,0)
print("年利率为:",rate)
'''
作业:小明房贷70万,年利率4%,准备还20年, 则每月月供多少
'''
rate=0.04/12
nper=20*12
pv=700000
pmt=np.pmt(rate,nper,pv)
print(pmt)
pmt2=np.pmt(0.04/12,20*12,700000)
print(pmt2)