一、模块介绍:
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)