Python科学计算:用numpy快速处理数据
非常重要的第三方库NumPy
是Python数据分析的基础
标准的Python中,用列表list保存数组的数值,由于列表中的元素可以是任意的对象,所以list保存的是对象的指针
Python的列表list就是数组,保存一个简单的数组[0,1,2],需要有3个指针和3个整数对象,对python不经济还浪费内存和计算时间
除了使用numpy,需要一些技巧来提升内存和提高计算资源的利用率,一个规则是:避免采用隐式拷贝,二是采用就地操作方式,举例:让一个数值x是原来的两倍,直接写成x*
=2,不要写成y=x*
2
结构数组
相应统计一个班级里学生的姓名、年龄、以及语文数组英语成绩怎么办
在c语言中可以定义结构数组,通过struct定义结构类型,在numpy中操作:
import numpy as np
persontype = np.dtype({
'names':['name','age','chinese','math','english'],
'formats':['s32','i','i','i','f']})
peoples = np.array([("ZhangFei",32,75,100,90),("GuanYu",24,85,43,87.5),("ZhaoYun",28,85,92,96.5),("HuangZhong",29,85,93,34)],dtype=persontype)
ages =peoples[:]['age']
chineses = peoples[:]['chineses']
maths = peoples[:]['math']
englishs = peoples[:]['english']
print np.mean(ages)
print np.mean(chineses)
print np.mean(maths)
print np.mean(englishs)
numpt使用dtype定义结构类型,然后定义数组的时候用array指定了结构数组的类型dtype = persontype,可以自由使用自定义的persontype,想知道每个人的语文成绩可以使用chineses = peoples[:]['chineses']
,计算平均值使用np.mean
ufunc运算
能对数组中每个元素进行函数操作
连续数组的创建
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
arange和linspace都是创建等差数组,x1 x2 都是【1,3,5,7,9】
arange()类似内置函数range(),通过指定初始值、终值、步长来创建等差数列的一维数组,默认是不包括终值的
linspace代表线性等分向量的含义
算数运算
进行加、减、乘、除、求n次方和取余数
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
print np.add(x1,x2)
print np.subtract(x1,x2)
print np.multiply(x1,x2)
print np.divide(x1,x2)
print np.power(x1,x2)
print np.remainder(x1,x2)
在n次方中,x2数组中的元素实际上是次方的次数,x1数组的元素为基数
取余函数里,可以用np.remainder(x1,x2)和用np.mod(x1,x2)结果一样
统计函数
需要对数据进行描述性的统计分析,比如了解数据中的最大值、最小值、平均值,是否符合正态分布
计数组/矩阵中的最大值函数amax(),最小值函数amin()
amin()用于计算数组中的元素沿指定轴的最小值,amin(a)是数组中全部元素的最小值,amin(a,0)沿axis=0轴的最小值,axis=0轴是把元素看成了[1,4,7],[2,5,8],[3,6,9]三个元素,所以最小值为[1,2,3],就是列元素。amin(a,1)沿着axis=1轴的最小值,axis=1把元素看成[1,2,3],[4,5,6],[7,8,9]三个元素,所以最小值为[1,4,7]
统计最大值与最小值之差ptp()
np.ptp(a)统计数组中最大值与最小值之差,即9-1=8,ptp(a,0)统计的是axis= 0轴的最大值与最小值之差,即7-1=6(8-2,9-3)ptp(a,1)统计的是沿着axis=1轴的最大值与最小值之差即3-1=2(6-4,9-7)
统计数组的百分位数percentile()
percentile()代表的是第p个百分位数,p的取值范围是0-100,如果p=0,求最小值,p=50,求平均值,p=100,求最大值,也可以求得在axis=0,axis=1两个轴上的p%的百分位数
统计数组中的中位数median()、平均数mean()
用median()和mean()求数组的中位数、平均值
统计数组中的加权平均值average()
a = np.array([1,2,3,4])
wts = np.array([1,2,3,4])
print np.average(a)
print np.average(a,weight=wts)
average()函数求加权平均,加权平均的意思是每个元素可以设置个权重,默认是每个元素的权重是相同的,所以np.average(a) = (1+2+3+4)/4=2.5,可以指定权重数组wts=[1,2,3,4],加权平均np.average(a,weight=wts)=(1*1+2*2+3*3+4*4)/(1+2+3+4)=3.0
统计数组中的标准差std()、方差var()
方差的计算是指每个数值与平均值之差的平方求和的平均值即mean((x-x.mean())**2)
,标注差就是方差的算术平方根,代表的是一组数组离平均值的分散程度
numpy排序
使用sort函数,sort(a,axis=-1,kind=‘quicksort’,order=None),默认是快速排序,kind可以指定quicksort,mergesort,heapsort表示快速排序,合并排序,堆排序,axis=-1,即沿着数组的最后一个轴进行排序,也可以取不同的axis轴,或者axis=none代表采用扁平化的方式作为一个向量进行排序,order字段对于结构化的数组可以指定按照某个字段进行排序
a = np.array([[4,3,2],[2,4,1]])
print np.sort(a)
print np.sort(a,axis=None)
print np.sort(a,axis=0)
print np.sort(a,axis=1)
[[2 3 4],[1 2 4]]
[1 2 2 3 4 4]
[[2 3 1],[4 4 2]]
[[2 3 4],[1 2 4]]
练习题:统计全班的成绩
假设一个团队里有5名学员,成绩如下所示,可以用numpy统计下这些人在语文、英语、数学中的平均成绩、最小成绩、方差、标准差,然后把这些人总成绩排序,得出名次进行成绩输出
姓名 | 语文 | 英语 | 数学 |
---|---|---|---|
张飞 | 66 | 65 | 30 |
关羽 | 95 | 85 | 98 |
赵云 | 93 | 92 | 96 |
黄忠 | 90 | 88 | 77 |
典韦 | 90 | 90 | 90 |
# _*_ coding:utf-8 _*_
import numpy as np
a = np.array([[4,3,2],[2,4,1]])
print(np.sort(a))
print(np.sort(a,axis=None))
print(np.sort(a,axis=0))
print(np.sort(a,axis=1))
persontype = np.dtype({
'names':['name','age','chinese','math','english'],
'formats':['s32','i','i','i','f']})
peoples = np.array([("ZhangFei",32,75,100,90),("GuanYu",24,85,43,87.5),("ZhaoYun",28,85,92,96.5),("HuangZhong",29,85,93,34),("DianWei",80,90,90)],dtype=persontype)
name = peoples[:]["name"]
chineses = peoples[:]["chineses"]
english = peoples[:]['english']
math = peoles[:]['math']
# 定义函数用于显示每一排的内容
def show(name , cj):
print('{}|{}|{}|{}|{}|{}'.format(name,np.mean(cj),np.min(cj),np.max(cj),np.var(cj),np.std(cj)))
print("科目|平均成绩|最小成绩|最大成绩|方差|标准差")
show("语文",chineses)
show("英语",english)
show("数学",math)
print("排名:")
# 用sorted函数进行排序
ranking = sorted(peoples,key=lambda x:x[1]+x[2]+x[3],reverse=True)
print(ranking)
用cmp()和lambda()按照三科成绩之和进行排序,并设置reverse=True进行降序排序