Python科学计算:用numpy快速处理数据

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代表线性等分向量的含义

扫描二维码关注公众号,回复: 9867829 查看本文章
算数运算

进行加、减、乘、除、求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进行降序排序

发布了75 篇原创文章 · 获赞 9 · 访问量 9176

猜你喜欢

转载自blog.csdn.net/ywangjiyl/article/details/104719775