Numpy
Numpy是python语言的一个扩充程序库,支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供了大量的数学函数库。
基本功能:
快速高效的多位数组对象ndarray
用于对数组执行元素级计算以及直接对数组执行数学运算的函数
用于读写硬盘还是那个基于数组的数据集的工具
线性代数运算,傅里叶变换,以及随机数生成
用于将C,C++,Fortran代码集成到python的工具
除了为python提供快速的数组处理能力,Numpy在数据分析方面还有另外一个主要作用,即作为在算法之间传递数据的容器
Numpy提供常用的数值数组,矩阵等函数
优点:
是基于向量化的运算
进行数值运算时Numpy数组比list效率高
>>> import numpy as np >>> np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) #10个元素的数组,() >>> list(np.arange(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #10个元素的列表,[] 数组转列表
Scipy
是一种使用Numpy来做高等数学,信号处理,优化,统计的扩展包
>>> from scipy import linalg ##线性代数的包引入 >>> a=np.array([[1,2],[3,5]]) #定义一个二维的数组 >>> a array([[1, 2],#第一行元素是1和2 [3, 5]])#第二张元素是3和5 >>> linalg.det(a)#行列式的值,1*5-2*3 -1.0
数据类型:使用astype将float类型转化为int的类型
>>> arr=np.array([1,2,4],dtype=np.float64)#指定数据类型 >>> print(arr.dtype) float64 >>> float=arr.astype(dtype=np.int)#转化为指定的数据类型 >>> print(float.dtype) int32
数组运算(加减乘除)
>>> a=np.array([[1,3,4,5],[2,4,5,5]]) >>> print(a*a) [[ 1 9 16 25] [ 4 16 25 25]] >>> print(a-a) [[0 0 0 0] [0 0 0 0]] >>> print(a+a) [[ 2 6 8 10] [ 4 8 10 10]]
>>> print(1/a)#标量操作作用在数组的每个元素上 [[1. 0.33333333 0.25 0.2 ] [0.5 0.25 0.2 0.2 ]]
对更高维度的数组的访问和操作
>>> b = np.array([[[1,2,3],[3,4,5]],[[4,4,2],[3,2,3]]]) >>> b[0][1] array([3, 4, 5]) >>> b[1] array([[4, 4, 2], [3, 2, 3]])
>>> c = b[0].copy()#进行复制copy >>> print(c) [[1 2 3] [3 4 5]]
>>> print(c) [[1 2 3] [3 4 5]] >>> print(c[0]) [1 2 3] >>> print(c[0,1])#访问方式 2 >>> print(c[0][1]) 2
如果是,的话代表的是对多维数组的访问和操作,如果是:代表的是当前维度数组的同级操作
切片操作:
>>> d=np.array([1,4,543,2,2,2,4,24,2]) >>> print(d[:3]) [ 1 4 543] >>> print(d[3:5]) [2 2] >>> print(d[5:]) [ 2 4 24 2]
>>> print(a)#对多维数组的访问和操作 [[1 3 4 5] [2 4 5 5]] >>> print(a[1,1])#访问的是第二个数组,第一列的数值 4 >>> print(a[1,1:])#访问的是第二个数组,第一列之后的数值 [4 5 5] >>> print(a[:1,1:])#访问的是第二个数组之前就是第一个数组,第一列之后的值(包括第一列) [[3 4 5]]
>>> import numpy as np >>> import numpy.random as np_random >>> name_arr=np.array(['bob','joe','will','bob']) >>> print(name_arr) ['bob' 'joe' 'will' 'bob'] >>> print(name_arr=='bob') [ True False False True] >>> rnd_arr=np_random.randn(7,4)#随机7*4数组 >>> print(rnd_arr) [[ 1.44479013 0.30643889 1.02635006 -0.06523054] [ 0.21681768 -0.22394964 -0.8573446 -1.34709504] [-1.14918202 -1.58816338 0.22967305 1.19319723] [ 0.17709409 -0.05995874 -0.53326976 -1.03580977] [-0.87692579 -0.45278675 0.3785352 -1.40043334] [ 0.06633862 -0.17220636 -0.02320015 1.34064211] [-2.06230887 0.75262294 -0.27911745 0.10554469]]
转置数组
>>> arr=np.arange(15).reshape((3,5)) >>> print(arr) [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] >>> print(arr.T) [[ 0 5 10] [ 1 6 11] [ 2 7 12] [ 3 8 13] [ 4 9 14]]
numpy的ndarray花式索引
花式索引是一个numpy术语,他指的是利用整数数组进行索引
一次传入多个索引数组会有一点特别,他返回的是一个一维数组,其中的元素对应各个索引元祖
>>> a=np.array([2,5,6,75,4,4]) >>> print(a) [ 2 5 6 75 4 4] >>> print(a[[3,2,1]])##根据对应的索引进行查找[[]] [75 6 5] >>> print(a[[-2,-5,-1]]) [4 5 4]
>>> arr=np.arange(32).reshape((4,8))##二维数组 >>> print(arr) [[ 0 1 2 3 4 5 6 7] [ 8 9 10 11 12 13 14 15] [16 17 18 19 20 21 22 23] [24 25 26 27 28 29 30 31]] >>> print(arr[[0,1,2,3],[1,5,3,6]])##找到对应的索引,哪行那列 [ 1 13 19 30] >>> print(arr[[0,1,2,3]][:,[0,4,6,2]])#前面对应的行数都有的列数 [[ 0 4 6 2] [ 8 12 14 10] [16 20 22 18] [24 28 30 26]]
可读性更好的写法,np.ix_
>>> print(arr[np.ix_([0,1,2,3],[2,3,1,4])]) [[ 2 3 1 4] [10 11 9 12] [18 19 17 20] [26 27 25 28]]
高维矩阵转换
>>> arr=np.arange(16).reshape((2,2,4)) >>> print(arr) [[[ 0 1 2 3] [ 4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]]] >>> print(arr.transpose((1,0,2))##相当于是arr[x][y][z]=arr[y][x][z] ... ) [[[ 0 1 2 3] [ 8 9 10 11]] [[ 4 5 6 7] [12 13 14 15]]]
通过真值表选择元素
>>> import numpy as np >>> >>> x_arr=np.array([1.1,1.2,1.3,1.4,1.5]) >>> y_arr=np.array([2.1,2.2,2.3,2.4,2.5]) >>> cond=np.array([True,False,True,True,False]) >>> print(np.where(cond,x_arr,y_arr) ... )#where的用法,如果条件符合cond的话就选择x_arr,否则的话就选择y_arr [1.1 2.2 1.3 1.4 2.5] >>> result=[(x if c else y) for x,y,c in zip(x_arr,y_arr,cond)] >>> print(result)##列表推导式,if cond就选择x,否则y [1.1, 2.2, 1.3, 1.4, 2.5]
求和求平均
>>> import numpy.random as np_random >>> a=np.random.randn(5,3) >>> print(a) [[-0.4793828 -1.88543369 -0.83255275] [-0.54435772 0.87330253 0.30212139] [-1.0161385 -0.12159845 0.68038966] [ 0.36880324 0.52197493 -0.65248151] [-0.48323991 -1.30866231 0.97144494]] >>> print(a.mean())####求平均 -0.24038739670967324 >>> print(a.sum())##求和 -3.6058109506450986 >>> print(a.mean(axis=1))#对每一行进行求平均 [-1.06578975 0.2103554 -0.1524491 0.07943222 -0.27348576] >>> print(a.sum(axis=0))##对每一列进行求和,axis可以省略 [-2.15431569 -1.92041699 0.46892174]
矩阵乘法
>>> import numpy.random as np_random >>> from numpy.linalg import inv,qr >>> x=np.array([[1.,2.,3.],[4.,5.,6.]]) >>> print(x) [[1. 2. 3.] [4. 5. 6.]] >>> y=np.array([[3.,5.],[3.,5.],[5.,6.]]) >>> print(x.dot(y))##结果是【1*3+2*3+3*6,1*5+2*5+3*6】 [[24. 33.] [57. 81.]]
>>> print(np.dot(x,np.ones(3)))
[ 6. 15.]
reshape重塑数组
>>> arr=np.arange(8) >>> print(arr) [0 1 2 3 4 5 6 7] >>> print(arr.reshape((2,4))##一维数组可以转化为二维数组 ... ) [[0 1 2 3] [4 5 6 7]] >>> print(arr.reshape((2,4)).reshape((4,2))#支持链式操作 ... ) [[0 1] [2 3] [4 5] [6 7]]