|
目录简介1.ndarray对象1.1创建数组1.1.1np.array()1.2数组形状与元素类型1.2.1ndarray.shape #获得形状1.2.2 ndarray.reshape() #改变形状1.2.3 ndarray.dtype #获得元素类型1.2.4 ndarray.astype() #转换元素类型 1.2.5 np.set_printoptions(precision=) #控制小数点位数1.3自动生成数组1.3.1np.arange() #等差一维数组1.3.2 np.linspace() #等差一维数组1.3.3 np.logspace() #指数数组1.3.4 np.zeros()、np.ones()、np.empty()、np.full() #特殊数组1.3.5 np.zeros_like()、np.ones_like()、np.empty_like()、np.full_like() #形状相同的特殊数组1.4存取元素1.4.1下标、切片1.4.2ndarray[[]] #批量提取数组元素1.4.3 ndarray.take() #获取元素1.4.3 np.compress() #通过布尔数组获取元素1.5多维数组1.5.1二维数组的创建1.5.2 二维数组的切片1.6 结构数组1.6.1定义结构数组np.dtype()1.6.2 结构数组的存取2.ufunc对象2.1四则运算2.2 比较运算和布尔运算2.2.1比较运算()2.2.2布尔运算(np.logical_and、or、not)2.2.3布尔运算(np.all()、np.any())2.3自定义ufunc函数2.3.1np.frompyfunc() #分段函数2.4广播(broadcasting)2.4.1广播处理规则2.4.2 np.broadcast_arrays() #查看广播之后的数组2.4.3 ndarray.repeat() #复制元素2.4.4 下标对象None2.5 ufunc的方法2.5.1 np..reduce() #对数组内元素四则运算2.5.2 np..accumulate() #对数组内元素四则运算2.5.3 np..reduceat() 计算多组reduce()的结果2.5.4 np..outer() #计算表3.多维数组的下标存取3.1下标对象3.2 整数数组作为下标3.3布尔数组作为下标3.3.1np.nonzero() #找出不为0的元素4.NumPy的函数库4.1随机数(np.random模块)4.1.1np.random.rand()(产生随机0~1浮点数)4.1.2 np.random.randn()(产生正态分布随机数)4.1.3 np.random.randint()(产生随机整数)4.1.4 np.random.normal()(随正态分布)4.1.5 np.random.uniform()(均匀分布)4.1.6 np.random.possion()(泊松分布)4.1.7 np.random.permutation() #产生乱序数组、打乱数组4.1.8 np.random.shuffle() #打乱数组4.1.9 np.random.choice() #随机抽取4.1.10 np.random.seed() #种子4.2 求和、平均值、方差4.2.1np.sum() #求和4.2.2 np.mean() #求平均数4.2.3 np.average() #计算加权平均数4.2.4 np.std() #计算标准差4.2.5 np.var() #计算方差4.2.6 np.product() #计算所有元素乘积4.3 大小与排序4.3.1np.min(),np.max(),np.minimum(),np.maximum(),np.ptp()4.3.2 np.argmax(),np.argmin() #求最值下标4.3.3np.unravel_index() #下标转化4.3.4np.sort() #排序4.3.5 np.argsort() #排序后的下标4.3.6np.lexsort() #多列排序4.3.6 np.lexsort()应用:成绩姓名全局排序4.3.7np.partition(),np.argpartition() #数组分割4.3.8np.median() #计算中位数4.3.9np.percentile() #计算百分数4.3.10np.searchsorted() #插入元素(二分查找)4.4统计函数4.4.1np.unique() #去除重复元素4.4.2np.bincount() #对整数数组的元素计数4.4.3np.histogram() #直方图统计4.5 分段函数4.5.1np.where() #if4.5.2 np.select() #多分支的if4.5.3 np.piecewise() #分段函数4.6操作多维数组4.6.1np.concatenate() #连接多个数组4.6.2np.vstack() #沿第0轴连接数组4.6.3 np.hstack() #沿第1轴连接数组4.6.4np.c[] #按列连接多个一维数组4.6.5np.split()、np.array_split() #将数组分为多段4.6.6np.transpose()、np.swapaxes() #重新设置轴的顺序4.6.7 np.swapaxes() #交换两个轴的顺序4.7多项式函数4.7.1np.poly1d() #转化成poly1d对象4.7.2deriv() #计算微分4.7.3integ() #计算积分4.7.4np.roots() #求根4.7.5np.poly() #用根求多项式方程4.7.6 np.polyfit() #拟合多项式函数4.8多项式函数类4.8.1np.polynomial.Polynomial() #创建Polynomial对象4.8.2p.deriv() #计算导函数4.8.3 np.polynomial.Chebyshev()(拓展)4.9各种乘积运算4.9.1np.dot() #矩阵乘积4.9.2np.inner() #内积4.9.3np.outer() #外积4.9.4np.tensordot() #张量乘积简介NumPy提供了两种基本的对象:1.ndarry:储存单一数据类型的多维数组2.nfunc:对数组进行处理的特殊函数查看numpy库的版本:importnumpyprint(numpy.__version__)'运行运行结果如下:1.19.21.ndarray对象1.1创建数组1.1.1np.array()用np.array()创建数组,括号中可以是列表、元组、多维列表:importnumpyasnpa=np.array([1,2,3])b=np.array((1,2,3))c=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])print(a)print(b)print(c)'运行运行结果如下:[123][123][[1234][5678][9101112]]1.2数组形状与元素类型1.2.1ndarray.shape #获得形状用ndarray.shape可获得数组的形状,返回元组(几行,几列):importnumpyasnpa=np.array([1,2,3])b=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])print(a.shape)print(b.shape)'运行运行结果如下:(3,)(3,4)'运行运行1.2.2 ndarray.reshape() #改变形状用ndarray.reshape(x,y)可以改变数组形状:importnumpyasnpa=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])print(a)b=a.reshape(2,6)print(b)'运行运行结果如下:[[1234][5678][9101112]][[123456][789101112]](ps.b是通过a的转化得来,因此在这之后对a操作也会引起b的变化,示例如下:)importnumpyasnpa=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])b=a.reshape(2,6)a[0][0]=100print(a)print(b)'运行运行结果如下:[[100234][5678][9101112]][[10023456][789101112]]1.2.3 ndarray.dtype #获得元素类型ndarray.dtype可以得到数组元素的类型:importnumpyasnpa=np.array([1,2,3])print(a.dtype)'运行运行结果如下:int32即32位的长整型(默认值与操作系统和Python有关)1.2.4 ndarray.astype() #转换元素类型astype()方法可以对数组的元素类型进行转换:importnumpyasnpa=np.array([1,2,3])b=a.astype(np.float)c=a.astype(np.complex)print(b.dtype)print(b)print(c.dtype)print(c)结果如下:float64[1.2.3.]complex128[1.+0.j2.+0.j3.+0.j] 1.2.5 np.set_printoptions(precision=) #控制小数点位数该函数可以控制输出的数组中显示小数点位数(set_printoptions()里还有很多参数,在此仅说明precision的意义)importnumpyasnpnp.set_printoptions(precision=3)#四舍五入保留三位小数a=np.array([0.12345,2.54687])print(a)'运行运行结果如下:[0.1232.547]1.3自动生成数组1.3.1np.arange() #等差一维数组np.arange(start,stop,step)可以创建等差数列的一维数组,其中开始值和终值遵循“左闭右开”的原则,类似于list中的range()importnumpyasnpa=np.arange(0,1,0.1)print(a)'运行运行结果如下:[0.0.10.20.30.40.50.60.70.80.9]1.3.2 np.linspace() #等差一维数组np.linspace(start,stop,number,endpoint=)中可以指定开始值、终值和元素个数,可以通过endpoint参数指定是否包含终值,endpoint=True则包含终值(默认为True)importnumpyasnpa=np.linspace(0,1,10,endpoint=False)print(a)'运行运行结果如下:[0.0.10.20.30.40.50.60.70.80.9]1.3.3 np.logspace() #指数数组np.logspace()与np.linspace()相似,其start和stop为10的幂,例如(0,3,3)表示从开始到,元素数量为4的等比数列:importnumpyasnpa=np.logspace(0,3,4)print(a)'运行运行结果如下:[1.10.100.1000.]1.3.4 np.zeros()、np.ones()、np.empty()、np.full() #特殊数组np.zeros():创建制定形状的全零数组np.ones():创建制定形状的全一数组np.empty():只分配数组所使用的内存np.full():将元素初始化为指定的值importnumpyasnpa=np.zeros((2,3),int)b=np.ones((2,3),int)c=np.empty((2,3),float)d=np.full((2,3),666)print(a)print(b)print(c)print(d)'运行运行结果如下:[[000][000]][[111][111]][[1.1.11.2][9.79.89.9]][[666666666][666666666]]1.3.5 np.zeros_like()、np.ones_like()、np.empty_like()、np.full_like() #形状相同的特殊数组括号中输入数组,创建与输入数组相同形状的全零数组、全一数组等等以np.zeros_like()为例:importnumpyasnpa=[[1,2,3,4],[5,6,7,8]]print(a)b=np.zeros_like(a)print(b)'运行运行结果如下:[[1,2,3,4],[5,6,7,8]][[0000][0000]]1.4存取元素1.4.1下标、切片与列表(list)中操作相同,不再赘述1.4.2ndarray[[]] #批量提取数组元素两个[[]]中填入需要的元素下标,该操作可以提取ndarry指定下标的元素并组成一个新的数组:importnumpyasnpa=np.arange(10,20,1)print(a)b=a[[2,4,6,8]]print(b)'运行运行结果如下:[10111213141516171819][12141618]这种方法中,可以理解为:b是将a中元素提取后重新创建的一个数组,因此a和b不共用内存,所以对a操作不会影响b,a和b是相互独立的,互不影响。ndarray[[]]也可以快速修改指定下标位置处元素的值:importnumpyasnpa=np.arange(0,10,1)print(a)a[[2,4,6,8]]=0,0,0,0print(a)'运行运行结果如下:[0123456789][0103050709]1.4.3 ndarray.take() #获取元素沿着指定轴获取元素importnumpyasnpa=np.arange(3*4).reshape(3,4)print(a)result=a.take(indices=0,axis=1)print(result)'运行运行结果如下:[[0123][4567][891011]][048]即:沿着axis=1(纵轴)取第0列元素1.4.3 np.compress() #通过布尔数组获取元素沿着指定轴通过布尔数组获取元素np.compress(condition,ndarray,axis=)importnumpyasnpa=np.array([0,1,-2,0,3])print(a)b=np.compress([1,0,1],a,axis=0)print(b)c=np.compress([1,0,1,0,1],a,axis=0)print(c)'运行运行结果如下:[01-203][0-2][0-23]即在数组a中,沿着axis=0的轴(横轴),取布尔数组中真值对应下标的元素1.5多维数组1.5.1二维数组的创建二维数组的创建实际上是一个加法表,由纵向量和横向量的元素相加而得,例如:importnumpyasnpa=np.arange(0,60,10).reshape(-1,1)b=np.arange(0,6)print(a)print(b)print(a+b)'运行运行结果如下:[[0][10][20][30][40][50]][012345][[012345][101112131415][202122232425][303132333435][404142434445][505152535455]]1.5.2 二维数组的切片importnumpyasnpa=np.arange(0,60,10).reshape(-1,1)+np.arange(0,6)print(a)print('\n')print(a[0,3:5])#表示第0行的第3到5个元素print('\n')print(a[4:,4:])#第4行之后及第4列之后元素组成的数组print('\n')print(a[:,2])#每一行的第二个元素组成的列表print('\n')print(a[2::2,::2])'运行运行结果如下:[[012345][101112131415][202122232425][303132333435][404142434445][505152535455]][34][[4445][5455]][21222324252][[202224][404244]]需要注意的是,b=a[0,3:5]这样的切片中,b是a的视图,他们共享数据,因此,改变a会对b造成影响1.6 结构数组1.6.1定义结构数组np.dtype()创建一个dtype对象person,其参数是字典,键:'names','formats',其中names定义结构中每个字段的名称;formats定义每个字段的类型: 'S30':长度为30个字节的字符串类型,(必须指明其长度) 'i':32位的整数类型,相当于'np.int32' 'f':32位的单精度浮点型,相当于'np.float32'然后调用array()创建数组,通过dtype参数来制定创建的数组的元素类型为personimportnumpyasnpperson=np.dtype({'names':['name','age','height'],#'names'是固定名称,不可更改,但name、age等可更改'formats':['S30','i','f']},#'formats'是固定名称,不可更改align=True)a=np.array([('Jia',20,177),('Zhang',19,159)],dtype=person)print(a)print(a.dtype)'运行运行结果如下:[(b'Jia',20,177.)(b'Zhang',19,159.)]{'names':['name','age','height'],'formats':['S30',''表示高位字节在前,即大端模式(bigendian);不显示则表示忽略字节顺序。1.6.2 结构数组的存取结构数组的存取和一般数组相同,通过下标就能获取:importnumpyasnpperson=np.dtype({'names':['name','age','height'],'formats':['S30','i','f']},align=True)a=np.array([('Jia',20,177),('Zhang',19,159)],dtype=person)print(a[0])'运行运行结果如下:(b'Jia',20,177.)'运行运行需要注意的是,输出的结果长得像元组,但并不是元组,而是结构:print(a[0].dtype)结果如下:{'names':['name','age','height'],'formats':['S30',')比较两个数组的对应元素,如果满足要求则不二数组对应位置为True,否则为False表达式对应的ufunc函数x1==x2equal(x1,x2[,y])x1!= x2not_equal(x1,x2[,y])x1x2greater(x1,x2[,y])x1>=x2greater_equal(x1,x2[,y])用符号也可以直接运算:importnumpyasnpa=np.array([1,2,3])b=np.array([3,2,1])print(a==b)print(a!=b)print(ab)print(a>=b)'运行运行结果如下:[FalseTrueFalse][TrueFalseTrue][TrueFalseFalse][TrueTrueFalse][FalseFalseTrue][FalseTrueTrue]2.2.2布尔运算(np.logical_and、or、not)Python中布尔运算使用and、or、not关键字,无法被重载,因此数组的布尔运算只能通过相应的ufunc函数进行,他们都以“logical_”开头:logical_and()、logical_or()、logical_not()importnumpyasnpa=np.array([1,2,3])b=np.array([3,2,1])print(np.logical_and(a>b,a==b))'运行运行结果如下:[FalseFalseFalse]2.2.3布尔运算(np.all()、np.any())NumPy中也定义了np.any()和np.all()np.any():只要有一个元素为True就返回Truenp.all():只有当全部元素都为True才返回Trueimportnumpyasnpa=np.array([0,1,2,3])print(np.all(a))print(np.any(a))'运行运行结果如下:FalseTrue'运行运行2.3自定义ufunc函数2.3.1np.frompyfunc() #分段函数通常情况下,自定义(def)出的函数只能计算单个值例如:定义一个分段函数,小于-10时输出-1,在-10到10之间输出0,大于10输出1。deff(a,b,x):ifx=b:return1c=6result=f(-10,10,c)print(result)'运行运行结果如下:0'运行运行但如果此时c不再是一个数字,而是一串数字,例如列表、数组,这种函数就不能直接计算,只能多次调用,单独计算。通过np.frompyfunc()可以将计算单个值的函数转化为能对数组的每个元素进行计算的ufunc函数。np.frompyfunc()的调用格式为:np.frompyfunc(func,nin,nout)。其中func:计算单个值的函数;nin:func中输入参数的个数;nout:func中返回值的个数。(注意:np.frompyfunc()只起到转换函数的作用,需要计算时要重新调用)例如:定义一个分段函数,小于-10时输出-1,在-10到10之间输出0,大于10输出1importnumpyasnpdeff(a,b,x):ifx=b:return1function=np.frompyfunc(f,3,1)#只起到转换函数的作用c=np.arange(-15,15,3)result=function(-10,10,c)#计算时重新调用function()函数print(c)#自变量print(result)#分段函数输出的结果'运行运行结果如下:[-15-12-9-6-3036912][-1-100000001]2.4广播(broadcasting)使用ufunc函数对两个数组计算时,会对两个数组的对应元素进行计算,因此要求两个数组形状相同。如果不同,会进行广播(broadcasting)处理2.4.1广播处理规则①以维数最多的数组为准,其他数组向它看齐,shape属性中不足的部分通过在前面加1补齐;②输出数组的shape属性是输入数组shape属性的各个轴上的最大值;③如果输入数组的某个长度为1,或与输出数组的对应轴长度相同,则这个数组可以用来计算,否则出错;④当输入数组的某个轴长度为1时,沿着该轴运算时,都用该轴上的第一组值。具体实例:先创建一个二维数组a,形状为(6,1)importnumpyasnpa=np.arange(0,60,10).reshape(-1,1)print(a)print(a.shape)'运行运行结果如下:[[0][10][20][30][40][50]](6,1)再创建一维数组b,其形状为(5,):importnumpyasnpa=np.arange(0,60,10).reshape(-1,1)b=np.arange(0,5)print(b)'运行运行结果如下:[01234]计算a与b的和,得到一个加法表,相当于计算两个数组中所有元素对的和,得到一个形状为(6,5)的数组:importnumpyasnpa=np.arange(0,60,10).reshape(-1,1)b=np.arange(0,5)c=a+bprint(c)'运行运行结果如下:[[01234][1011121314][2021222324][3031323334][4041424344][5051525354]]由于a和b的维数不同,根据①,需要让b的shape属性向a对齐,于是在b的shape属性前补加1,变为(1, 5),即从[0,1,2,3,4,5]变成[[0,1,2,3,4,5]],则a和b的shape变为(6,1)和(1,5),根据②,输出的数组长度为各个轴长度的最大值,则输出的c的shape属性为(6,5)由于b的第0轴(横着的,行)的长度为1,a的第0轴的长度为6,要把b的第0轴扩展成长度为6才能相加,即:[[01234][01234][01234][01234][01234][01234]]对a同理,则可以保证形状相同,才能相加。2.4.2 np.broadcast_arrays() #查看广播之后的数组np.broadcast_arrays()可以查看广播之后的数组,返回广播后的多个数组importnumpyasnpa=np.arange(2*3).reshape(2,3)print(a)print(a.shape)b=np.array([1,2,3])print(b)print(b.shape)result=np.broadcast_arrays(a,b)print(result)'运行运行结果如下:[[012][345]](2,3)[123](3,)[array([[0,1,2],[3,4,5]]),array([[1,2,3],[1,2,3]])]2.4.3 ndarray.repeat() #复制元素ndarray.repeat(复制的次数,axis=)其中,axis=0表示第0轴(列),即沿着axis=0的轴,复制数组中各个元素的值axis=1表示第1轴(行),同理。例1:对二维数组,沿第0轴复制importnumpyasnpa=np.array([[1,2,3,4,5]])print(a)c=a.repeat(3,axis=0)print(c)'运行运行结果如下:[[12345]][[12345][12345][12345]]例2:对一维数组,沿第0轴复制importnumpyasnpa=np.array([1,2,3,4,5])print(a)c=a.repeat(3,axis=0)print(c)'运行运行结果如下:[12345][111222333444555]例3:对二维数组,沿第1轴复制importnumpyasnpa=np.array([[1,2,3,4,5]])print(a)c=a.repeat(3,axis=1)print(c)'运行运行结果如下:[[12345]][[111222333444555]]2.4.4 下标对象None表示在None对应的位置创建一个长度为1的新轴,例如:a[None,:]和a.reshape(1,-1)等效importnumpyasnpa=np.array([1,2,3,4,5])print(a)print(a[None,:])print(a.reshape(1,-1))print(a[:,None])'运行运行结果如下:[12345][[12345]][[12345]][[1][2][3][4][5]]2.5 ufunc的方法ufunc方法本身还有一些函数,这些方法只对2个输入、1个输出的ufunc函数有效,其他的ufunc对象调用这些方法时会抛出ValueError异常2.5.1 np..reduce() #对数组内元素四则运算np..reduce(array,axis=,dtype=)是指运算符,例如add、subtract、multiple、divide等等,该方法沿着axis指定的轴对数组进行操作,相当于沿着axis轴,将添加到数组的各个元素之间,输出计算结果,例如:importnumpyasnpa=np.array([1,2,3,4])b=np.add.reduce(a,axis=0)#1+2+3+4print(b)c=np.subtract.reduce(a,axis=0)#1-2-3-4print(c)d=np.multiply.reduce(a,axis=0)#1*2*3*4print(d)'运行运行结果如下:10-824'运行运行2.5.2 np..accumulate() #对数组内元素四则运算accumulate与reduce类似,只是返回与输入形状相同的数组,保存所有的中间计算过程:importnumpyasnpa=np.array([1,2,3,4])b=np.add.accumulate(a,axis=0)print(b)#[1,1+2,1+2+3,1+2+3+4]c=np.subtract.accumulate(a,axis=0)print(c)#[1,1-2,1-2-3,1-2-3-4]d=np.multiply.accumulate(a,axis=0)print(d)#[1,1*2,1*2*3,1*2*3*4]'运行运行结果如下:[13610][1-1-4-8][12624]2.5.3 np..reduceat() 计算多组reduce()的结果reduceat()方法计算多组reduce()的结果,通过indices参数指定一系列的起始和终止位置,例如:importnumpyasnpa=np.array([1,2,3,4])result=np.add.reduceat(a,indices=[0,1,0,2,0,3,0])print(result)'运行运行结果如下:[12336410]对于indices的每一个值,都会计算出一个值,结果中除了最后一个参数外,计算过程如下:ifindices[i].reduce(a[indices[i]:indices[i+1]])else:#如果该元素不小于后面一个元素result[i]=a[indices[i]]对于最后一个元素,计算过程如下:.reduce(a[indices[-1]:])2.5.4 np..outer() #计算表np..outer(a,b),其结果是一个计算表(加法表,乘法表,减法表),例如:importnumpyasnpa=np.array([1,2,3,4,5])b=np.array([2,3,4])result=np.multiply.outer(a,b)print(result)'运行运行结果如下:[[234][468][6912][81216][101520]]相当于是乘法表(加法,减法同理):234----------1|2342|4683|69124|812165|1015203.多维数组的下标存取3.1下标对象多维数组的下标是一个“长度=数组维度”的数组,如果下标的长度>数组维数,则会出错;如果下标长度10时,y=0importnumpyasnpnp.random.seed(5)x=np.random.randint(0,15,size=10)print(x)#指明自变量分段的条件condition=[x=5,x10]#指明各段的函数choice=[x**2,-x,0]y=np.select(condition,choice)print(y)'运行运行结果如下:[314136609847][900-6-60-9-816-7]4.5.3 np.piecewise() #分段函数尽管用np.select,如果输入的数组很大,计算时会产生许多保存中间结果的数组,会发生大量内存分配和释放。为了解决这个问题,有np.piecewise()专门计算分段函数np.piecewise(x,condlist,funclist)condlist:长度为M的布尔数组列表funclist:长度为M或M+1的函数列表,这些函数的输入和输出都是数组;如果长度为M,则正常计算;如果长度为M+1,则最后一个函数计算所有条件都为False时的值例如:分段函数:x10时,y=0importnumpyasnpnp.random.seed(5)x=np.random.randint(0,15,size=10)print(x)#指明自变量分段的条件condition=[x=5,x10]#指明各段的函数,此处需要用lambdafunclist=[lambdax:x**2,lambdax:-x,0]y=np.piecewise(x,condition,funclist)print(y)'运行运行结果如下:[314136609847][900-6-60-9-816-7]4.6操作多维数组函数总览函数名功能函数名功能concatenate连接多个数组vstack沿第0轴连接数组hstack、c_[]沿第1轴连接数组column_stack按列连接多个一维数组split、array_split将数组分为多段transpose重新设置轴的顺序swapaxes交换两个轴的顺序4.6.1np.concatenate() #连接多个数组用于连接多个数组,第一个参数为需要连接的数组,用()括起来,第二个参数是axis,用于指定沿axis轴进行连接,默认为0importnumpyasnpnp.random.seed(5)a=np.zeros((3,3))b=np.ones((3,3))r1=np.concatenate((a,b))print(r1)r2=np.concatenate((a,b),axis=1)print(r2)'运行运行结果如下:[[0.0.0.][0.0.0.][0.0.0.][1.1.1.][1.1.1.][1.1.1.]][[0.0.0.1.1.1.][0.0.0.1.1.1.][0.0.0.1.1.1.]]4.6.2np.vstack() #沿第0轴连接数组np.vstack()用于沿着第0轴连接数组,当被连接数组是长度为N的一维数组时,将其形状改为(1,N)其参数为要连接的数组,用()括起来importnumpyasnpnp.random.seed(5)a=np.zeros((3,3))b=np.ones((3,3))r1=np.vstack((a,b))print(r1)'运行运行结果如下:[[0.0.0.][0.0.0.][0.0.0.][1.1.1.][1.1.1.][1.1.1.]]4.6.3 np.hstack() #沿第1轴连接数组与np.vstack()相似,沿着第1轴连接数组,当所有数组都是一维时,沿着第0周连接数组importnumpyasnpnp.random.seed(5)a=np.zeros((3,3))b=np.ones((3,3))r1=np.hstack((a,b))print(r1)'运行运行结果如下:[[0.0.0.1.1.1.][0.0.0.1.1.1.][0.0.0.1.1.1.]]4.6.4np.c[] #按列连接多个一维数组和np.hstack()一样,按列连接数组调用格式为:np.c_[a,b]importnumpyasnpnp.random.seed(5)a=np.zeros((3,3))b=np.ones((3,3))r1=np.c_[a,b]print(r1)'运行运行结果如下:[[0.0.0.1.1.1.][0.0.0.1.1.1.][0.0.0.1.1.1.]]4.6.5np.split()、np.array_split() #将数组分为多段np.split()、np.array_split()用法基本相同,将一个数组沿着指定轴分成多个数组,可以直接或指定切分轴上的切分点下标np.split(a,indices_or_sections,axis=0)indices_or_sections:类型为int或一维数组,表示切的位置。如果值是一个整数n的话,就将数组平均分为n份(如果不能平均分则报错);如果是一个数组的话,就医数组中的数字为索引切开axis:对于二维数组,axis=0表示横向切(用刀横着切数组),axis=表示纵向切具体见下方实例:1.当indices_or_sections为整数时):importnumpyasnpnp.random.seed(5)a=np.arange(1,10).reshape(3,3)print(a)r1=np.split(a,3)#indices_or_sections为整数print(r1)A,B,C=np.split(a,3)#indices_or_sections为整数print(A)print(B)print(C)'运行运行结果如下:[[123][456][789]][array([[1,2,3]]),array([[4,5,6]]),array([[7,8,9]])][[123]][[456]][[789]]2.当indices_or_sections为数组时(axis=0):importnumpyasnpnp.random.seed(5)a=np.arange(5*6).reshape(5,6)print(a)A,B,C=np.split(a,[1,4])print(A)print(B)print(C)'运行运行结果如下:[[012345][67891011][121314151617][181920212223][242526272829]]#横向切(横着切),在纵向下标为1和4处分隔[[012345]][[67891011][121314151617][181920212223]][[242526272829]]3.当indices_or_sections为数组时(axis=0):importnumpyasnpnp.random.seed(5)a=np.arange(5*6).reshape(5,6)print(a)A,B,C=np.split(a,[1,4],axis=1)print(A)print(B)print(C)'运行运行结果如下:[[012345][67891011][121314151617][181920212223][242526272829]]#纵向切(竖着切),在横向下标为1和4处分隔[[0][6][12][18][24]][[123][789][131415][192021][252627]][[45][1011][1617][2223][2829]]4.6.6np.transpose()、np.swapaxes() #重新设置轴的顺序np.transpose()用于修改轴的顺序例如:np.transpose(a,[1,2,0])表示:新数组的第0轴存放a的第1轴,新数组的第1轴存放a的第2轴,新数组的第2轴存放a的第0轴importnumpyasnpa=np.arange(1*2*3).reshape(1,2,3)print(a.shape)r1=np.transpose(a,[1,2,0])print(r1.shape)'运行运行结果如下:(1,2,3)(2,1,3)'运行运行4.6.7 np.swapaxes() #交换两个轴的顺序np.swapaxes()用于交换两个轴的顺序例如:np.swapaxes(a,0,1)表示:将a的第0轴和第1轴交换顺序importnumpyasnpa=np.arange(2*3*4).reshape(2,3,4)print(a.shape)r1=np.swapaxes(a,0,1)print(r1.shape)'运行运行结果如下:(2,3,4)(3,2,4)'运行运行4.7多项式函数4.7.1np.poly1d() #转化成poly1d对象np.poly1d()可以将列表、数组转化成poly1d对象,该对象可以像函数一样调用importnumpyasnpa=np.array([1,2,3])r1=np.poly1d(a)print(r1)'运行运行结果如下:21x+2x+3即表示:用法1:可以像函数一样被调用:importnumpyasnpa=np.array([1,2,3])f=np.poly1d(a)print(f)r1=f(2)#x=2带入print(r1)'运行运行结果如下:21x+2x+311#表示x=2时上式的结果用法2:多项式的四则运算importnumpyasnpa=np.array([1,2,3])f=np.poly1d(a)print(f)print(f+[5,5])print(f*2)print(f*f)print(f/[1,3])'运行运行结果如下:21x+2x-3#f21x+7x+2#f+[5,5]22x+4x-6#f*24321x+4x-2x-12x+9#f*f(poly1d([1.,-1.]),poly1d([0.]))#f/[1,3]#返回两个poly1d类型的元素,第一个是商,第二个是余数4.7.2deriv() #计算微分deriv()用于计算多项式函数的微分,调用格式为:poly1d对象.deriv()importnumpyasnpa=np.array([1,2,-3])f=np.poly1d(a)print(f)r1=f.deriv()print(r1)'运行运行结果如下:21x+2x-32x+24.7.3integ() #计算积分integ()用于计算多项式函数的积分,调用格式为:poly1d对象.integ()importnumpyasnpa=np.array([1,2,-3])f=np.poly1d(a)print(f)r1=f.integ()print(r1)'运行运行结果如下:21x+2x-3320.3333x+1x-3x4.7.4np.roots() #求根np.roots()用于计算多项式函数的根,调用格式为:np.roots(poly1d对象)importnumpyasnpa=np.array([1,2,-3])f=np.poly1d(a)print(f)r1=np.roots(f)print(r1)'运行运行结果如下:21x+2x-3[-3.1.]4.7.5np.poly() #用根求多项式方程np.poly()可以通过根求多项式系数importnumpyasnpa=np.array([1,2])r1=np.poly(a)print(r1)'运行运行结果如下:[1.-3.2.]4.7.6 np.polyfit() #拟合多项式函数np.polyfit():根据数据拟合出相应的多项式函数,找出与这组数据的误差平方最小的多项式的系数np.polyfit(x,y,最高次的次数)importnumpyasnpa=np.array([1,2,3,4,5])b=np.array([1,4,9,16,25])r1=np.polyfit(a,b,3)print(r1)'运行运行结果如下:[1.62920807e-171.00000000e+00-4.54973822e-152.70557374e-15]4.8多项式函数类np.polynomial中提供了更丰富的多项式函数类,其中多项式各项的系数按照幂从小到大的顺序排列(与4.7相反)4.8.1np.polynomial.Polynomial() #创建Polynomial对象np.polynomial.Polynomial()可以创建Polynomial对象,并计算多项式函数importnumpyasnpa=np.array([1,2,3])f=np.polynomial.Polynomial(a)r1=f(2)#计算1*(2^0)+2*(2^1)+3*(2^2)print(r1)'运行运行结果如下:17.0'运行运行4.8.2p.deriv() #计算导函数对于Ploynomial对象,p.deriv()可以计算导函数:importnumpyasnpa=np.array([1,2,3])f=np.polynomial.Polynomial(a)r1=f.deriv()print(r1)'运行运行结果如下:poly([2.6.])即:,求导得 4.8.3 np.polynomial.Chebyshev()(拓展)切比雪夫多项式是一个正交多项式序列,一个n次多项式可以表示为多个切比雪夫多项式的加权和使用Chebyshev类表示由切比雪夫多项式组成的多项式多项式可由Chebyshev.basis(i)获得1.利用convert方法转换多项式类型语句:Chebyshev.basis(i).convert(kind=)例如:将转化成Polynomial类:importnumpyasnpa=np.polynomial.Chebyshev.basis(4)print(a)r1=a.convert(kind=np.polynomial.Polynomial)print(r1)'运行运行结果如下:cheb([0.0.0.0.1.])poly([1.0.-8.0.8.])即:2.切比雪夫节点切比雪夫多项式的根称为切比雪夫节点可以用于多项式插值。相应的差值多项式能最大程度降低龙格现象(等距插值多项式在两端有很大的振荡),并且提供多项式在连续函数的最佳一致逼近。详细查看(p101)4.9各种乘积运算函数总览函数名功能函数名功能dot矩阵乘积inner内积outer外积tensordot张量乘积4.9.1np.dot() #矩阵乘积对于一维数组,其计算内积;对于二维数组,其计算矩阵乘积通用公式:dot(a,b)[i,j,k,m]=sum(a[i,j,:]*b[k,:,m])对于一维数组:直接计算内积,即向量点乘importnumpyasnp#一维数组a=np.arange(3)b=np.array([2,3,4])print(a)print(b)r1=np.dot(a,b)print(r1)'运行运行结果如下:[012][234]11#0*2+1*3+2*4对于二维数组:进行矩阵乘法(第一行乘第一列,m*n与n*k才能相乘)importnumpyasnp#二维数组a=np.arange(6).reshape(3,2)b=np.array([[2,3,4],[5,6,7]])print(a)print(b)r1=np.dot(a,b)print(r1)'运行运行结果如下:[[01][23][45]][[234][567]][[567][192429][334251]]4.9.2np.inner() #内积np.inner()用于计算内积对于一维数组,inner()和dot()一样,对于二维数组,具体计算过程见下例计算内积时,需保证两个矩阵形状相同!!!importnumpyasnp#二维数组a=np.arange(6).reshape(2,3)b=np.array([[2,3,4],[5,6,7]])print(a)print(b)r1=np.inner(a,b)print(r1)'运行运行结果如下:[[012]#a行[345]]#b行[[234]#c行[567]]#d行[[1120]#[a*ca*d][3874]]#[b*cb*d]4.9.3np.outer() #外积np,outer()用于计算外积,且只对一维数组进行计算,如果传入的是多维数组,先将数组展平为一维数组再计算(具体计算过程见下例)对于一维数组:importnumpyasnp#一维数组a=np.arange(3)b=np.array([2,3,4])print(a)print(b)r1=np.outer(a,b)print(r1)'运行运行结果如下:[012][234][[000]#[0*20*30*4]或[a11*b11a11*b12a11*b13][234]#[1*21*31*4][468]]#[2*22*32*4]对于二维数组:importnumpyasnp#二维数组a=np.arange(6).reshape(2,3)b=np.array([[2,3,4],[5,6,7]])print(a)print(b)r1=np.outer(a,b)print(r1)'运行运行结果如下:[[012][345]][[234][567]][[000000]#[0*20*30*40*50*60*7][234567]#[1*21*31*41*51*61*7][468101214]#……[6912151821][81216202428][101520253035]]4.9.4np.tensordot() #张量乘积np.tensordot()将两个多维数组a和b指定轴上的对应元素相乘并求和np.tensordot(a,b,axes=[[轴1],[轴2]])axes有两个参数,第一个表示a中的轴,第二个表示b中的轴,该方法会将指定轴的对应元素相乘再相加(即:第一?和第一?相乘并相加,放在a11,第一?和第二?相乘再相加,放在a12,……其中轴1和轴2分别控制两个问号,0表示列,1表示行。例如:axes=[[0],[1]]表示第一列和第一行相乘并相加,放在a11,以此类推……)如果axes是整数,则表示把a中的后axes个轴和b中的前axes个轴进行相乘再相加的运算,其他轴保持不变importnumpyasnp#二维数组a=np.arange(9).reshape(3,3)b=np.array([[2,3,4],[5,6,7],[8,9,10]])print(a)print(b)r1=np.tensordot(a,b,axes=[[0],[0]])#表示a的列和b的列相乘,放在a11……print(r1)'运行运行结果如下:[[012][345][678]][[234][567][8910]][[637281][7890102][93108123]]
|
|