今天是4.28号。
天气又开始变阴,雨持续了一整个月。
之前学习了用python写爬虫和python与mongodb数据库、文件之间的简单操作。想想自己还是想用python去做数据分析,或者能够在证券量化工作中用到相应的知识,所以接下来会主要学习数据分析相关的库numpy,pandas,matplotlib等,至于机器学习的库scikit-learn则等掌握了前三个库的使用后再根据需要去学习。
import numpy as np
可以认为numpy就是一个多维的列表(list):
例如
a=[[1,2,3],
[3,4,5],]
a.shape能够得到a是nxn维数组;
a.dtype能够得到数组中的元素类型是什么;同时注意narray中所有元素的类型必须是一致的。
取数组a中特定位置的值也是用索引,一维直接用a[x],二维用a[x,y]即第x行第y列的数据。
(1) arange函数在numpy中用于创建等差数组,使用频率非常高。arange非常类似range函数,在没有学习numpy时在for循环中,几乎都用到了range,二者的区别仅仅在于是arange返回的是一个arr数组,而range返回的是list。
range()函数的用法:
range(1,5) #代表从1到5(不包含5)
[1, 2, 3, 4]
range(1,5,2) #代表从1到5,间隔2(不包含5)
[1, 3]
range(5) #代表从0到5(不包含5)
[0, 1, 2, 3, 4]
(2) 花式索引,即利用整数数组进行索引。
例如
arr=[[1,1,2,3],
[1,4,5,6],
[3,2,5,0],
[2,3,1,9]]
那么arr[[1,3]]得到的结果为arr([[1,4,5,6],[2,3,1,9]])
(3) 进行矩阵计算时常用到转置(T)和内积:
arr.T,可以直接表示转置
np.dot()函数可以计算内积,如np.dot(a,a.T)
(4) arr是一个数组,有一些函数可以快速对数组中所有的元素进行相应的计算操作:
用法例子为:np.abs(arr),np.sqrt(arr)
对两个数组的操作为:add(x,y),multiply(x,y)等,执行方法是均是对应位置元素进行计算。
(5)条件方法 np.where(cond,x,y)三元表达式的使用,其中cond表示条件;x、y可以是单独的数字,可以是数组。在数据分析中,它常用于根据一个数组产生新的数组。
例如假设现在有两个数值数组和一个布尔型值数组:
xarr=np.array([2,2,3,5,6])
yarr=np.array([5,6,9,0,1])
con=np.array([False,True,True,True,False])
现在想根据con的值选取xarr、yarr中的值,当con中值为True时选xarr的值,否则选y的值。
用一般的方法为:
result=[(x if c else y) for x,y,c in zip(xarr,yarr,con)]
使用np.where()则能极大提高计算效率,用法为:
result=np.where(con,xarr,yarr)
**(6) 数学和统计方法 **
可通过sum,mean,std等方法对对整个数组或某个轴上的数据进行统计计算,通常叫做约简(reduction)。
对于axis不懂的可以直接这样理解,axis=0或没有即默认为零,就竖着看;aixs=1就横着看。
若x为一个数组使用方法为:
x.sum(), x.mean()
x.sum(axis=0或1),其中axis=0 表示按行将每一列的向量相加,axis=1表示按列将每一行的向量相加。
sum也可以用来对布尔型数组中的True值计数:
例如:arr=randn(100)
(arr>0).sum()
(7) sort()排序
若x为一个数组,x.sort()默认将数组x中的元素从小到大排序。若x是多维数组,x.sort()会默认按从小到大对每一列进行排序;x.sort(1)则会从小到大对每一行进行排序。
(8) 数组的集合运算
np.unique()与python中set()的功能类似。
例若a=np.array([1,2,3,2,3,4,6])
则np.unique(a)结果为array([1,2,3,4,6]),np,unique()在去除重复元素的同时将元素从小到大进行了排序。
其他集合运算如下,注意集合运算的结果均是数组
(9) 线性代数的相关计算
这里暂时不作介绍,后面有需要用到时具体学习并补充进来
(10) 随机数生成
numpy.random模块对python中内置的random进行了补充。使用随机数生成函数时一般要加size=()的参数。
例如使用的方法为:
a). numpy.random.normal(size=(4,4))可以得到4x4维服从正太分布的数组,
其中size是normal()函数的一个参数,random的其他函数也有该参数,若该参数缺失,则默认只生成一个值.
b). randint(low,high,size=xx)
表示从low到high范围内随机生成size个整数,且high值取不到。
注意:当high缺失或声明high=None时,将唯一的一个数作为上限。
例如:a=np.random.randint(3,size=10)和a=np.random.randint(3,high=None,size=(2,3))
二者表达的意思是一样的。
c). random.randn(n,n)可以生成nxn维的服从正太分布的随机数据数组。
部分numpy.random函数如下:
最后再说一下reshape()函数可以把一维数组转化为自己想要的多维数组,如下:
np.random.randint(8,size=9).reshape(3,3)