利用Python进行数据分析(四)
NumPy基础
数学与统计方法
是的,没错,还是NumPy。我不习惯一直看这种书面文章式的东西,所以前几天看烦了 抽空复习了下爬虫的知识,然后把斗鱼的弹幕爬了下来,并且 基本每一句都附加了很多很详细的注释,github链接如下:
https://github.com/BrainZou/PythonSpider/tree/master/douyudanmu
基本的数组统计方法:
有两种使用:arr.mean或者np.mean(arr)。这里列举两个,注意参数0,1代表轴。仍然还是建议都在Anaconda里面敲上一遍。
用于布尔型数组的方法
在上面这些方法中,布尔值会被强制转换为1(True)和0(False)。因此,sum经常被用来对布尔型数组中的True值计数:
In[160]:arr=randn(100)
In[161]:(arr>0).sum() # 正值的数量
0ut[161]:44
另外还有两个方法any和a11,它们对布尔型数组非常有用。any用于测试数组中是否存在
一个或多个True,而al1则检查数组中所有值是否都是True:
In [162]:bools=np.array([False,False,True,False])
In [163]:bools.any()
0ut[163]:True
In [164]:bools.al1()
0ut[164]:False
这两个方法也能用于非布尔型数组,所有非0元素将会被当做True。
排序
跟Python内置的列表类型一样,NumPy数组也可以通过sort方法就地排序:
arr.sort() arr.sort(1)#(在1轴上排序)
就地排序会改变数组本身。np.sort(arr)则不会。
数组的集合运算
举个栗子:
In [178]:ints=np.array([3,3,3,2,2,1,1,4,4])
In[179]:np.unique(ints)
0ut[179]:array([1,2,3,4])
等价于
In [180]:sorted(set(names))
0ut[180]:['Bob','Joe','Will']
文件输入输出
NumPy能够读写磁盘上的文本数据或二进制数据。后面的章节将会告诉你一些pandas中
用于将表格型数据读取到内存的工具。
将数组以二进制格式保存到磁盘
np.save和np.load 直接将数组以二进制的格式保存在.npy文件中
In[183]:arr=np.arange(10)
In [1841]:np.save('some array',arr)
当末尾没有扩展名.npy时会自动加上。然后通过np.load读取磁盘上的数组。
In[185]:np.load('some_array.npy')
out[185]:array([o,1,2,3,4,5,6,7,8,9])
通过np.savez可以将多个数组保存到一个压缩文件中,将数组以关键字参数的形式传入
即可:
In [186]:np.savez('array_archive.npz',a=arr,b=arr)
加载.npz文件时,你会得到一个类似字典的对象,该对象会对各个数组进行延迟加载:
In [187]:arch=np.1oad('array_archive.npz')
In [188]:arch['b']
out[188]:array([o,1,2,3,4,5,6,7,8,9])
存取文本文件
In [192]:arr=np.loadtxt('array_ex.txt',delimiter=',')
In [193]:arr
0ut[193]:
array([[ o.5801,0.1867,1.0407,1.1344],
[0.1942,-0.6369,-0.9387,0.1241],
[-0.1264,0.2686,-0.6957,0.0474],
[-1.4844,0.0042,-0.7442,0.0055],
[2.3029,0.2001,1.6702,-1.8811],
[-0.1932,1.0472,0.4828,0.9603]])
np.savetxt执行的是相反的操作:将数组写到以某种分隔符隔开的文本文件中。
genfromtxt跟1oadtxt差不多,只不过它面向的是结构化数组和缺失数据处理。
本章只简单介绍使用,后续将详细介绍pandas,DataFrame对象~
线性代数
上一个章节也介绍了*对两个二维数组相乘得到的是一个元素级的积,不是矩阵点积。所以要使用dot函数:
In[196]:x In[197]:y
0ut[196]: out[197]:
array([[ 1.,2.,3.], array([[ 6.,23.],
[4.,5.,6.]]) [-1.,7.],
[8.,9.]])
In[198]:x.dot(y) #相当于np.dot(x,y)
0ut[198]:array([[ 28.,64.],
[67.,181.]])
一个二维数组跟一个大小合适的一维数组的矩阵点积运算之后将会得到一个一维数组:
In[199]:np.dot(x,np.ones(3))
out[199]:array([6.,15.])
#可以把一维数组写成竖状的。
函数 | 说明 |
---|---|
diag | 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0) |
dot | 矩阵乘法 |
trace | 计算对角线元素的和 |
det | 计算矩阵行列式 |
eig | 计算方阵的本征值和本征向量 |
inv | 计算方阵的逆 |
pinv | 计算矩阵的Moore-Penrose伪逆 |
qr | 计算QR分解 |
svd | 计算奇异值分解(SVD) |
solve | 解线性方程组Ax=b,其中A为一个方阵 |
lstsq | 计算Ax=b的最小二乘解 |
numpy.linalg函数
函数 | 说明 |
---|---|
diag | 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0) |
dot | 矩阵乘法 |
trace | 计算对角线元素的和 |
det | 计算矩阵行列式 |
eig | 计算方阵的本征值和本征向量 |
inv | 计算方阵的逆 |
pinv | 计算矩阵的Moore-Penrose伪逆 |
qr | 计算QR分解 |
svd | 计算奇异值分解(SVD) |
solve | 解线性方程组Ax=b,其中A为一个方阵 |
lstsq | 计算Ax=b的最小二乘解 |
随机数生成
函数 | 说明 |
---|---|
seed | 确定随机数生成器的种子 |
permutation | 返回一个序列的随机排列或返回一个随机排列的范围 |
shuffle | 对一个序列就地随机排列 |
rand | 产生均匀分布的样本值 |
randint | 从给定的上下限范围内随机选取整数 |
randn | 产生正态分布(平均值为0,标准差为1)的样本值,类似于MATLAB接口 |
binomial | 产生二项分布的样本值 |
normal | 产生正态(高斯)分布的样本值 |
beta | 产生Beta分布的样本值 |
chisquare | 产生卡方分布的样本值 |
gamma | 产生Gamma分布的样本值 |
uniform | 产生在[0,1)中均匀分布的样本值 |
numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。
numpy.random函数:
函数 | 说明 |
---|---|
seed | 确定随机数生成器的种子 |
permutation | 返回一个序列的随机排列或返回一个随机排列的范围 |
shuffle | 对一个序列就地随机排列 |
rand | 产生均匀分布的样本值 |
randint | 从给定的上下限范围内随机选取整数 |
randn | 产生正态分布(平均值为0,标准差为1)的样本值,类似于MATLAB接口 |
binomial | 产生二项分布的样本值 |
normal | 产生正态(高斯)分布的样本值 |
beta | 产生Beta分布的样本值 |
chisquare | 产生卡方分布的样本值 |
gamma | 产生Gamma分布的样本值 |
uniform | 产生在[0,1)中均匀分布的样本值 |
而Python内置的random模块则只能一次生成一个样本值。从下面的测试结果中可以看出,如果需要产生大量样本值,numpy.random快了不止一个数量级:
In[210]:from random import normalvariate
In[211]:N = 1000000
In[212]:%timeit samples = [normalvariate(0,1)for _ in xrange(N)]
1loops,best of 3:1.33s per 1oop
In[213]:%timeit np.random.normal(size=N)
10 loops,best of 3:57.7 ms per 1oop
例子:请自行百度随机漫步 并且实现。
总结
NumPy基础到这就介绍完了,其中包含了很多很细致的函数,及巧妙的应用,建议多多使用,之后不熟练时再来看看复习查阅。
个人微信公众号:BrainZou