环境:python3.5
推荐两本书:《线性代数》、《利用python进行数据分析》
需要的库:
matplotlib快速绘图
scipy
numpy
对于大部分数据分析应用而言,最常用我最关注的功能集中在:
用于数据整理和清理、子集构造和过滤、转换等快速的矢量化数组运算。
常用的数组算法,如排序、唯一化、集合运算等。
高效的描述统计和数据聚合/摘要运算。
用于异构数据集的合并/链接运算的数据对齐和关系型数据运算。
将条件逻辑表述为数组表达式(而不是带有if-elif-else分支的循环)。
数据的分组运算(聚合、转换、函数应用等)。
Numpy则提供了上述功能的计算基础。
Np入门
进阶本质上就是对基础功能的实用化,讲起来比较琐碎。
Numpy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算比等价的纯python方式快上一两个数量级(甚至更多),尤其是各种数值运算。
比如说:
numpy.where在三元条件表达式if condition else y的矢量化版本。假设我们有一个布尔数组和两个值数组:
#举例:
xarr=np.array([1.1,1.2,1.3,1.4,1.5])
yarr=np.array([2.1,2.2,2.3,2.4,2.5])
zarr=np.array([True,False,True,True,False])
result=[(x if c else y)for x,y,c in zip(xarr,yarr,zarr)]
print(result)
result=np.where(zarr,xarr,yarr)
print(result)
#结果:
[1.1000000000000001, 2.2000000000000002, 1.3,1.3999999999999999, 2.5]
[ 1.1 2.2 1.3 1.4 2.5 ]
从结果看,两者结果一致。
从使用角度看,np.where更简单,从而能引申出更复杂的逻辑。
np.where(cond1%cond2,0,np.where(cond1,1,np.where(cond2,2,1)))
从性能角度看,纯python循环对大数据处理速度不是很快,且无法用于多维数组。np.where则可以实现。
#排序
arr=np.array(...)
arr.sort()
#唯一化等集合逻辑
np.unique(arr) #计算x中的唯一元素,并返回有序结果
np.intersect1d(x,y) #计算x和y中的公共元素,并返回有序结果
np.union1d(x,y) #计算x和y中的并集,并返回有序结果
np.setdiff1d(x,y) #计算集合的差
一般情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的。
arr=np.arange(10)
np.save('arrar',arr)
brr=np.load('arrar.npy')
线性代数(如矩阵乘法、矩阵分解、行列式以及其方阵数学等)是任何数组库的重要组成部分。
diag #求取对角线元素
dot #矩阵乘法
trace #对角线元素和==sum(diag(arr))
det #行列式
inv #矩阵逆
solve #解线性方程 Ax=b
对于np.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。我想举个例子:
#随机漫步
nsteps=1000
draws=np.random.randint(0,2,size=nsteps)
steps=np.where(draws>0,1,-1)
walk=steps.cumsum()
plt.plot(np.arange(start=0,stop=1000,step=1),walk)
plt.show()
笔者介绍了在numpy基础上的一些进阶功能,还有很多需要读者去挖掘。数据分析更有用更有趣的方法还属后续的pandas,pandas是基于Numpy构建的,让Numpy为中心的应用变得更加简单。
如果您看到这篇文章有收获或者有不同的意见,欢迎点赞或者评论。
python群:190341254
丁。