python之numpy模块的基本使用一、numpy概述NumPy(NumericalPython的简称)是高性能科学和数据分析的基础包。numpy模块提供了Python对N维数组对象的支持:ndarray,ndarray数组中的元素须为同一数据类型,这一点与python的列表是不一样的。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。其主要功能如下。二、创建ndarray数组代码示例:#-*-coding:utf-8-*-importnumpy;print'使用列表生成一维数组'data=[1,2,3,4,5,6]x=numpy.array(data)printx#打印数组printx.dtype#打印数组元素的类型print'使用列表生成二维数组'data=[[1,2],[3,4],[5,6]]x=numpy.array(data)printx#打印数组printx.ndim#打印数组的维度printx.shape#打印数组各个维度的长度。shape是一个元组print'使用zero/ones/empty创建数组:根据shape来创建'x=numpy.zeros(6)#创建一维长度为6的,元素都是0一维数组printxx=numpy.zeros((2,3))#创建一维长度为2,二维长度为3的二维0数组printxx=numpy.ones((2,3))#创建一维长度为2,二维长度为3的二维1数组printxx=numpy.empty((3,3))#创建一维长度为2,二维长度为3,未初始化的二维数组printxprint'使用arrange生成连续元素'printnumpy.arange(6)#[0,1,2,3,4,5,]开区间printnumpy.arange(0,6,2)#[0,2,4]三、指定ndarray数组元素的类型NumPy数据类型:代码示例:print'生成指定元素类型的数组:设置dtype属性'x=numpy.array([1,2.6,3],dtype=numpy.int64)printx#元素类型为int64printx.dtypex=numpy.array([1,2,3],dtype=numpy.float64)printx#元素类型为float64printx.dtypeprint'使用astype复制数组,并转换类型'x=numpy.array([1,2.6,3],dtype=numpy.float64)y=x.astype(numpy.int32)printy#[123]printx#[1.2.63.]z=y.astype(numpy.float64)printz#[1.2.3.]print'将字符串元素转换为数值元素'x=numpy.array(['1','2','3'],dtype=numpy.string_)y=x.astype(numpy.int32)printx#['1''2''3']printy#[123]若转换失败会抛出异常print'使用其他数组的数据类型作为参数'x=numpy.array([1.,2.6,3.],dtype=numpy.float32);y=numpy.arange(3,dtype=numpy.int32);printy#[012]printy.astype(x.dtype)#[0.1.2.]四、ndarray数组与标量/数组的运算运算规则:数组与标量的算术/逻辑运算会转换为各个元素与标量的算术/逻辑运算,数组与数组的算术/逻辑运算会转换为两个数组对应的各个元素的算术/逻辑运算。代码示例:print'ndarray数组与标量/数组的运算'x=numpy.array([1,2,3])printx*2#[246]printx2#[FalseFalseTrue]y=numpy.array([3,4,5])printx+y#[468]printxy#[FalseFalseFalse]五、ndarray数组的基本索引和切片代码示例:print'ndarray的基本索引'x=numpy.array([[1,2],[3,4],[5,6]])printx[0]#[1,2]printx[0][1]#2,普通python数组的索引printx[0,1]#同x[0][1],ndarray数组的索引x=numpy.array([[[1,2],[3,4]],[[5,6],[7,8]]])printx[0]#[[12],[34]]y=x[0].copy()#生成一个副本z=x[0]#未生成一个副本printy#[[12],[34]]printy[0,0]#1y[0,0]=0z[0,0]=-1printy#[[02],[34]]printx[0]#[[-12],[34]]printz#[[-12],[34]]print'ndarray的切片'x=numpy.array([1,2,3,4,5])printx[1:3]#[2,3]右边开区间printx[:3]#[1,2,3]左边默认为0printx[1:]#[2,3,4,5]右边默认为元素个数printx[0:4:2]#[1,3]下标递增2x=numpy.array([[1,2],[3,4],[5,6]])printx[:2]#[[12],[34]]printx[:2,:1]#[[1],[3]]x[:2,:1]=0#用标量赋值printx#[[0,2],[0,4],[5,6]]x[:2,:1]=[[8],[6]]#用数组赋值printx#[[8,2],[6,4],[5,6]]六、ndarray数组的布尔型索引和花式索引布尔型索引:使用布尔数组作为索引。布尔型索引代码示例:print'ndarray的布尔型索引'x=numpy.array([3,2,3,1,3,0])#布尔型数组的长度必须跟被索引的轴长度一致y=numpy.array([True,False,True,False,True,False])printx[y]#[3,3,3]printx[y==False]#[2,1,0]printx=3#[TrueFalseTrueFalseTrueFalse]printx[~(x=3)]#[2,1,0]print(x==2)|(x==1)#[FalseTrueFalseTrueFalseFalse]printx[(x==2)|(x==1)]#[21]x[(x==2)|(x==1)]=0printx#[303030]花式索引:使用整型数组作为索引。花式索引代码示例:print'ndarray的花式索引:使用整型数组作为索引'x=numpy.array([1,2,3,4,5,6])printx[[0,1,2]]#[123]printx[[-1,-2,-3]]#[6,5,4]x=numpy.array([[1,2],[3,4],[5,6]])printx[[0,1]]#[[1,2],[3,4]]printx[[0,1],[0,1]]#[1,4]打印x[0][0]和x[1][1]printx[[0,1]][:,[0,1]]#打印01行的01列[[1,2],[3,4]]#使用numpy.ix_()函数增强可读性printx[numpy.ix_([0,1],[0,1])]#同上打印01行的01列[[1,2],[3,4]]x[[0,1],[0,1]]=[0,0]printx#[[0,2],[3,0],[5,6]]七、ndarray数组的转置和轴对换数组的转置/轴对换只会返回源数据的一个视图,不会对源数据进行修改。代码示例:print'ndarray数组的转置和轴对换'k=numpy.arange(9)#[0,1,....8]m=k.reshape((3,3))#改变数组的shape复制生成2维的,每个维度长度为3的数组printk#[012345678]printm#[[012][345][678]]#转置(矩阵)数组:T属性:mT[x][y]=m[y][x]printm.T#[[036][147][258]]#计算矩阵的内积xTxprintnumpy.dot(m,m.T)#numpy.dot点乘#高维数组的轴对象k=numpy.arange(8).reshape(2,2,2)printk#[[[01],[23]],[[45],[67]]]printk[1][0][0]#轴变换transpose参数:由轴编号组成的元组m=k.transpose((1,0,2))#m[y][x][z]=k[x][y][z]printm#[[[01],[45]],[[23],[67]]]printm[0][1][0]#轴交换swapaxes(axes:轴),参数:一对轴编号m=k.swapaxes(0,1)#将第一个轴和第二个轴交换m[y][x][z]=k[x][y][z]printm#[[[01],[45]],[[23],[67]]]printm[0][1][0]#使用轴交换进行数组矩阵转置m=numpy.arange(9).reshape((3,3))printm#[[012][345][678]]printm.swapaxes(1,0)#[[036][147][258]]八、ndarray通用函数通用函数(ufunc)是一种对ndarray中的数据执行元素级别运算的函数。一元ufunc:一元ufunc代码示例:print'一元ufunc示例'x=numpy.arange(6)printx#[012345]printnumpy.square(x)#[01491625]x=numpy.array([1.5,1.6,1.7,1.8])y,z=numpy.modf(x)printy#[0.50.60.70.8]printz#[1.1.1.1.]二元ufunc:二元ufunc代码示例:print'二元ufunc示例'x=numpy.array([[1,4],[6,7]])y=numpy.array([[2,3],[5,8]])printnumpy.maximum(x,y)#[[2,4],[6,8]]printnumpy.minimum(x,y)#[[1,3],[5,7]]九、NumPy的where函数使用numpy.where(..,..,..)有三个参数,第一个参数为一个布尔数组,第二个参数和第三个参数可以是标量也可以是数组。代码示例:print'where函数的使用'cond=numpy.array([True,False,True,False])x=numpy.where(cond,-2,2)printx#[-22-22]cond=numpy.array([1,2,3,4])x=numpy.where(cond2,-2,2)printx#[22-2-2]y1=numpy.array([-1,-2,-3,-4])y2=numpy.array([1,2,3,4])x=numpy.where(cond2,y1,y2)#长度须匹配printx#[1,2,-3,-4]print'where函数的嵌套使用'y1=numpy.array([-1,-2,-3,-4,-5,-6])y2=numpy.array([1,2,3,4,5,6])y3=numpy.zeros(6)cond=numpy.array([1,2,3,4,5,6])x=numpy.where(cond5,y3,numpy.where(cond2,y1,y2))printx#[1.2.-3.-4.-5.0.]十、ndarray的统计方法可以通过这些基本统计方法对整个数组/某个轴的数据进行统计计算。代码示例:print'numpy的基本统计方法'x=numpy.array([[1,2],[3,3],[1,2]])#同一维度上的数组长度须一致printx.mean()#2printx.mean(axis=1)#对每一行的元素求平均printx.mean(axis=0)#