[数学建模学习笔记] 第二天 Numpy库的使用

 2.1~2.7、Numpy的使用

1.Numpy简介

        1.介绍:Numpy(Ndimensional array,n维数组)用于解决相同数据类型的元素组成的N维数组的问题。

使用如下:

        (1)使用array()函数可将数据转化成数组形式

          将变量1中的数据变成数组类型(用list做容器) :变量2=numpy.array(变量1)       

        (2)numpy的创建数组的函数
import numpy as np

# 1.Numpy 调用array()将现有数据类型转化为数组
d1=[1,2,3,4]
d2=(1,2,3,4,5,6)
d3=[[1,2],[2,3],[4,5]]
d4=[(1,2,3),(4,5,6),(7,8,9)]
d5=((1,2,4),(3,5,7))

d11=np.ones((3,3))  #创建尺寸为(3*3)的数组并初始化为1
d21=np.zeros((3,4))  #创建尺寸为(3*4)的数组并初始化为0
d31=np.arange(10)  #创建一个一维数组(0~10)不包括十
d41=np.arange(2,10)  #创建一个一维数组(2~10)不包括十
d51=np.arange(2,10,2)  #创建一个一维数组(2~10)之间的偶数,不包括十

print("d11:",d11,"d21:",d21,"d31:",d31,"d41:",d41,"d51:",d51,sep='\n')
        (3)数组尺寸的获取与重排:

        使用属性shape和方法arange((新尺寸)),具体使用如下:

          特别注意:以将(i1*j1)尺寸的数组使用reshape(i2,j2,k2……)方法,必须满足条件:i2*j2*k2*……>=i1*j1。

import numpy as np

# 1.Numpy 调用array()将现有数据类型转化为数组
d1=[1,2,3,4]
d2=(1,2,3,4,5,6)
d3=[[1,2],[2,3],[4,5]]
d4=[(1,2,3),(4,5,6),(7,8,9)]
d5=((1,2,4),(3,5,7))


d11=np.array(d1) 
d21=np.array(d2)
del d1,d2

print("d11'shape:",d11.shape)  #返回元组,表示(一维尺寸,二维尺寸……, )
print("d11'shape:",d21.shape)
c=np.arange(9)  #创建一个一维数组(0~10)不包括十
c1=c.reshape((3,3))  #将原来的一维数组重塑为(3*3)尺寸的  【要满足条件:3*3<=9】
print("c:\n",c)
print("c1:\n",c1)

        (4)数组运算(加减乘除,乘方,数组函数计算):

                注意:所有运算的数组都有尺寸相同的情况下使用

import numpy as np
d1=[1,2,3,4]
d2=(1,2,3,4,5,6)
d3=[[1,2],[2,3],[4,5]]
d4=[(1,2,3),(4,5,6),(7,8,9)]
d5=((1,2,4),(3,5,7))
d6=(-2,4,8,1)

#4.数组运算
d11=np.array(d1)
d61=np.array(d6)
#要保证两个数组的尺寸一样才可以正常进行 加减乘除 运算
print("d11+d61:",d11+d61)
print("d11-d61:",d11-d61)
print("d11*d61:",d11*d61)
print("d11/d61:",d11/d61) #元素对应进行运算

print("d11/3:",d11/3) #所有元素对应除3
print("3/d11:",3/d11)  #3除以所有元素
print("d11**3:",d11**3)  #所有元素对应取三次幂

print("sqrt(d11):",np.sqrt(d11))#对应所有元素取根号
print("exp(d11):",np.exp(d11))  #对应所有元素对e的指数
print("cos(d11):",np.cos(d11))  #对应所有元素取cos
print("abs(d61):",np.abs(d61))  #对应所有元素取绝对值
        (5)数组的切片
                方法1:与普通python切片一致,用‘  :’进行切片,只不过分了不同的维度
import numpy as np  
D=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])  #定义数组D
#访问D中行为1,列为2的数据,注意下标是从0开始的。
D12=D[1,2]  #访问D中第1、3列数据
D1=D[:,[1,3]]  #访问D中第1、3行数据
D2=D[[1,3],:]  
Dt1=D[D[:,0]>5,:] #取D中满足第0列大于5的所有列数据,本质上行控制为逻辑列表

#Dt2=D[D[:,0]>5,[2,3]] #取D中满足第0列大于5的2、3列数据,本质上行控制为逻辑列表
TF=[True,False,False,True] #取D中第0、3行的所有列数据,本质上行控制为逻辑列表,取逻辑值为真的行
Dt3=D[TF,:]#取D中第0、3行的2、3列数据
#Dt4=D[TF,[2,3]]

D5=D[D>4]# 取D中大于4的所有元素

                 运行结果:

          方法2:利用ix_()函数进行数组切片

                  数组的切片,也可以通过ix_()函数构造行、列下标索引器,实现数组的切片操作。ix_(行的操作,列的操作)

import numpy as np  
#6利用ix_()函数进行数组切片
D=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])  #定义数组D
D3=D[np.ix_([1,2],[1,3])]#提取D中行数为1、2,列数为1、3的所有元素

D4=D[np.ix_(np.arange(2),[1,3])]#提取D中行数为0、1,列数为1、3的所有元素,其中行数

D6=D[np.ix_(D[:,1]<11,[1,2])]#提前以D中第1列小于11得到的逻辑数组作为行索引,列数为1、2的所有元素

D7=D[np.ix_(D[:,1]<11,[2])]#提前以D中第1列小于11得到的逻辑数组作为行索引,列数为2的所有元素

TF=[True,False,False,True]#提前以2.5.1中的TF=[True,False,False,True]逻辑列表为行索引,列数为2的所有元素
D8=D[np.ix_(TF,[2])]
D9=D[np.ix_(TF,[1,3])]#提前以2.5.1中的TF=[True,False,False,True]逻辑列表为行索引,列数为1,,3的所有元素

                运算结果:

        (6)数组连接

                水平连接:numpy.hstack((a1,a2))  #要求行数相同

                垂直连接:numpy.vstack((a1,a2))  #要求列数相同 

        (7)数据存取

                numpy('文件名',数组名)  #将数组的数据存到‘文件’里

2.Numpy 数组形态变换

        (1)数组形态变换,ravel()与reshape()相反,使用ravel()将多维数组变为一维数组。
import numpy as np  

#7Numpy 数组形态变换 与reshape相反,使用ravel()将多维数组变为一维数组
arr=np.arange(12)
arr1=arr.reshape(3,4)
arr2=arr1.ravel()  #又把arr1转换为一维数组
        (2)数组排序和搜索

        注意:np的子函数只适用于数组,其他类型要转化为数组使用。 argmax(数组名) 和argmin(数组名) 返回的都是索引。

import numpy as np
#数组排序和搜索
arr1=[5,7,82,1,4,56,12,3,66,7,88,99]
arr=np.array(arr1).reshape(3,4)
arr=np.sort(arr)  #升序排序
MinIndex=np.argmin(arr)  #找最小值的索引
MaxIndex=np.argmax(arr)
Minindex1=np.argmin(arr,axis=1)  #返回各行最小值的索引
Maxindex1=np.argmax(arr,axis=0)  #返回各列最大值的索引

 3.矩阵与线性代数运算

        (1)创建Numpy矩阵

        主要使用mat、matrix、bmat函数来创建矩阵,主要的属性有转置(T)、共轭转置(H)、逆矩阵(I)。

import numpy as np  
#9创建Numpy矩阵
##主要使用mat、matrix、bmat函数来创建矩阵
mat1=np.mat("1 2 3;4 5 6;7 8 9") #转化为矩阵
mat2=np.matrix([[1,2,3],[4,5,6],[7,8,9]])  #转化为矩阵

arr1=np.eye(3)  #3行3列的单位矩阵
arr2=3*arr1     #每个元素*3
mat=np.bmat("arr1 arr2;arr1 arr2")  #矩阵子块的连接

##矩阵的属性和基本运算(转置T、共轭转置H、逆矩阵I)
arr3=mat1.T
arr4=mat1.H
arr5=mat1.I

运行结果:

        (1)矩阵与线性代数运算 

        主要使用+、-、*、/和multiply() 进行加减乘除和点乘运算

import numpy as np 
#10矩阵与线性代数运算 
#主要使用+、-、*、/和multiply() 进行加减乘除和点乘运算
mat1=np.mat("1 2 3;4 5 6;7 8 9")
mat2=mat1*3
Add=mat1+mat2
Jf=mat1-mat2
Cf=mat1*mat2  #对应元素相乘
Dc=np.multiply(mat1,mat2) #点乘、矩阵乘法

运算结果:

(2)线性代数运算

        主要是:矩阵相乘(dot)、求逆矩阵(inv)、求解线性方程组(solve)、求特征值和特征向量(eig)、求特征值(eigvals)、计算奇异值分解(svd)、求行列式(det)。

    a.矩阵相乘:

import numpy as np 
#线性代数运算  np.linalg.做前缀使用
mat1=np.mat("1 1 1;1 2 3;1 3 6")
inverse=np.linalg.inv(mat1)  #求mat1的逆
A=np.dot(mat1,inverse)  #求mat1和inverse的乘积

        运算结果:

        b.其他运算:

        求逆矩阵(inv)、求解线性方程组(solve)、求特征值和特征向量(eig)、求特征值(eigvals)、计算奇异值分解(svd)、求行列式(det)

import numpy as np 
#线性代数运算  np.linalg.做前缀使用
mat1=np.mat("1 1 1;1 2 3;1 3 6")
inverse=np.linalg.inv(mat1)  #求mat1的逆
A=np.dot(mat1,inverse)  #求mat1和inverse的乘积
b=np.array([4,3,-1])

A=mat1
x=np.linalg.solve(A,b)  #求解(A,b)
A_value,A_vector=np.linalg.eig(A)  #求A的特征值与特征向量
U,Sigma,V=np.linalg.svd(A,full_matrices=False)  #将A进行计算奇异值分解
A_value=np.linalg.det(A)  #将A转化为行列式

怎么计算奇异值分解(svd):奇异值分解与特征值分解相似,对于任意一个m*n的矩阵A,可以对其进行奇异值分解为

其中:U是一个m*m的矩阵;Sigma是一个m*n的对角矩阵,主对角线上的元素成为奇异值V是一个n*n的矩阵,U与V都是酉矩阵,即组成它们的都是标准正交基。

猜你喜欢

转载自blog.csdn.net/2401_84448191/article/details/138095205