一、模块介绍:
python提供的能提供数组、矩阵。方程组运算的扩展库,简便快捷,运用为主
二、数组:array
1.数组创建:
# 一、语法模板 import numpy as np import random # 2.创建数组 n=num=10 s=start=0 e=end=10 st=step=1 # 1.array() 可将list、tuple和 range()创建的生成器 转化为数组 test=np.array(([1,2,3],(1,2,3),range(1,4,1))) # 2.arange(),参数与range相同 test=np.arange(s,e,st) # 3.linspace(a,b,c,endpoint=True(默认)) 创建等差数组c为等差取的数的个数,endpoint默认为True范围为[a,b],False为[a,b) test=np.linspace(s,e,st,endpoint=False) # 4.logspace(a,b,c,base=10,endpoint=True) 等价于base**linspace(a,b,c,endpoint=True) test=np.logspace(s,e,st,base=2,endpoint=False) # 5.特殊数组创建 test=np.zeros(n)#0矩阵二维数组 test=np.ones(n)#1矩阵二维数组 test=np.identity(n)#单位矩阵二维数组 test=np.empty(n)#申请数组空间,不初始化 test=np.diag(range(10))#对角矩阵,主对角元素为传入的迭代对象 # 6.随机数组创建 test=np.random.rand(n)#n个[0,1)的随机数 test=np.random.randint(s,e,(n,n))#创建(n,n)数组,元素范围,[s,e) test=np.random.standard_normal((n,n,n))#(n,n,n)元素用标准正态分布数随机赋值 print(test)
2.数组元素修改:
n=num=10 s=start=0 e=end=10 st=step=1 test=np.array([range(s,e,st),range(e,s,-st),range(s,e,st)]) # 1,下标修改 print(test) test[s]=1 #将行下标为s的数全部改为1 test[s,s]=2 #将下标为s,s的项改为2 # 2.多元素同时修改 test[1:,2:]=3 #将行标大于等于1列标大于等于2的项全部改为3 test[1:,2:]=range(8,0,-1) #将下面两行都按所给元素赋值 test[1:,2:]=range(8,0,-1),range(2,10,1) #两行分别赋值 # 3.元素增加 np.append(test,[1,2,3]) #尾部增加元素,可以增加多个 np.insert(test,e,n) #在下标为e的元素前插入n
3.数组的运算:
# 3.数组的运算:
n=num=10
s=start=0
e=end=10
st=step=1
test=np.array([range(s,e,st),range(e,s,-st),range(s,e,st)])
# 1.数组与标量运算+ - * / ** % 可当除数与被除数,结果为新矩阵
test+=2
test=2/test
# 2.数组与数组运算
# 同型矩阵
test+=[range(s,e,st),range(s,e,st),range(s,e,st)]
# 非同型矩阵:广播运算 下标为i的元素与列表为i的元素相运算
test=range(10)*test
# 3.内积运算(数组向量(一维数组)点乘运算)
np.dot(np.array(range(s,e,st)),np.array(range(s,e,st)))
# 4.模块函数
np.sin(test) #正弦余弦运算
np.log(test) #对数运算
np.round(test) #四舍五入
np.ceil(test) #向上取整
#分段函数
np.where(s6,test<2],[lambda test:test*2,lambda test:test*3]) #test>6的元素*2,<2的*3,其余的变为0,条件不限定
# 5.布尔运算
#np.isclose(test1,test2,rtol,atol) #判断两个数组对应元素是否在误差范围内,返回bool数组#rtol相对误差,atol绝对误差
#np.allclose(test1,test2,rtol,atol) #判断两个数组对应元素是否在误差范围内,返回bool值#rtol相对误差,atol绝对误差
print(test>1) #输出判断后的bool值矩阵
print(test[test>1]) #输出元素大于1的项组成的数组
print(sum((test<2)&(test>1))) #输出(1,2)之间的数的个数,(test<2)&(test>1)返回bool数组,sum求和
print(np.all(test>0)) #任意数是否大于0
print(np.any(test>0)) #是否存在数大于0
# *:a,b两个数组可由a[a>b]找到a>b的项
print(test)
4.数组元素访问与排序等操作:
# 4.数组元素访问与排序等操作:
n=num=10
s=start=0
e=end=10
st=step=1
test=np.array([range(s,e,st),range(e,s,-st),range(s,e,st)])
# 1.下标访问
print(test[0]) #第1行元素
print(test[0][0]) #第1行第1列元素
print(test[0,4]) #第1行5列元素,等价于test[0][4]
print(test[[0,1]]) #第1,2行元素
print(test[[0,1],[0,1]]) #第1,2行的1,3列元素
# 2.切片访问
print(test[0][::-1]) #第1行逆序输出
print(test[0][::2]) #第1行间隔输出
print(test[0][:6]) #第一行取到下标为5的元素,不包括终点
print(test[0][:0]) #第一行取到下标为0的元素,不包括终点,即为空数组
print(test[::,1:4:2]) #取2,4列元素
# 3.数组排序
test=np.array([[1,3,7,32,2],[1,34,7,3,4]])
index_sort=np.argsort(test[1]) #numpy的排序函数,返回从小到大数的下标数组
print(test.argmax(),test.argmin()) #返回test的最大与最小值的下标,只有用np.array创造的数组才可调用
test.sort() #python自带排序
# 4.改变数组形状 shape与size
print(test.shape) #返回数组的形状
print(test.size) #数组的大小
test.shape=(5,2) #数组改为5行2列,数组元素应不变,-1表示自动计算行数:size/lines
test=test.reshape(2,5) #rehape返回新数组,但修改的数组大小应不变
test=np.array([range(5),range(5)])
# test.reshape(2,7)报错
test.resize(2,7) #可更改数组大小,多余补0
test=np.resize(test,(3,10)) #np的resize等函数返回新数组,不改变原数组,多余的项补原数组元素
print(test)
# 5.数组堆叠与合并vstack() hstack() concatenate()
test1=np.arange(10).reshape(1,10) #创建两个数组
test2=np.arange(10).reshape(1,10)
print(np.vstack((test1,test2))) #垂直堆叠
print(np.hstack((test1,test2))) #水平堆叠
print(np.concatenate((test1,test2),axis=1)) #参数axis默认为0增加行,为1增加列
三、矩阵:matrix
1.矩阵创建:
# 1.矩阵创建 n=10 s=0 e=10 st=1 # 1.生成矩阵 *:可迭代对象都可创建 test=np.matrix([range(10),range(10)[::-1],range(10)]) # 2.访问矩阵元素 print(test[1,1]) print(test)
2.矩阵相关的操作(转置、逆、特征值获取):
# 2.矩阵相关操作 n=10 s=0 e=10 st=1 test=np.matrix([range(10),range(10)[::-1],range(10)]) # 1.矩阵转置:.T返回转置矩阵 print(test.T) # 2.矩阵求逆(方阵才有逆矩阵) 与逆矩阵相乘得到的矩阵近似为单位矩阵 test1=np.matrix([[1,2,3],[2,3,5],[4,12,6]]) test2=np.linalg.inv(test1) print(test1,test2,test2*test1,test1*test2,sep="n") # 3.特征值获得: print(test.mean()) #矩阵的平均值 print(test.mean(axis=0)) #矩阵每列的平均值 print(test.mean(axis=0).shape) #axis=0时为求纵向平均值,此时矩阵只有一行 print(test.mean(axis=1)) #矩阵每行的平均值 print(test.mean(axis=1).shape) #axis=1时为求纵向平均值,此时矩阵只有一列 print(test.sum()) #矩阵元素和 print(test.sum(axis=0)) #矩阵列元素和 print(test.sum(axis=1)) #矩阵行元素和 print(test.max()) #矩阵最大值,可添加参数axis求行列最大项 print(test.argmax()) #矩阵最大值下标,可添加参数axis print(test.diagonal()) #矩阵对角元素 print(test.nonzero()) #非零元素下标 返回数组,前面为行坐标,后为列坐标
3.矩阵运算与方差、协方差、标准差计算:
# 3.矩阵运算与方差、协方差、标准差计算: n=10 s=0 e=10 st=1 test=np.matrix([[1,2,3],[2,3,5],[4,12,6]]) #1.矩阵四则运算 print(test) print(test+test) #+ print(test-test) #- print(test*test) #* print(test**3) #幂 print(n*test) #数乘 #2.相关系数矩阵:主对角都为1,其他元素绝对值小于1 接近1表示变化趋势越接近,正负表示为正相关还是负相关 print(np.corrcoef(test,test[::-1])) print(np.corrcoef(test,test)) #3.差值计算 print(np.cov(test)) #协方差 print(np.std(test)) #标准差 print(np.cov([1,2,3,4])) #方差
四、求解线性方程组:
# 线性方程组求解 n=10 s=0 e=10 st=1 test=np.matrix([[1,2,3],[2,3,5],[4,12,6]]) # 获得系数矩阵与常数矩阵 a,b a=test b=np.array([2,4,7]) ans=np.linalg.solve(a,b) #求解方程组 可通过np.dot(a,ans)看结果是否为b验证 print(ans) ans=np.linalg.lstsq(a,b,rcond=None) #最小二乘解,返回方程组解,余项,矩阵秩,a的奇异值 print(ans)



