04 用numpy快速处理数据

    技术2022-07-10  125

    # Author:Nimo_Ding # numpy是Python中使用最多的第三方库,而且是scipy、pandas等数据科学的基础库。 # numpy所提供的数据结构是Python数据分析的基础。 # 列表list的元素在系统内存中是分散存储的;而numpy数组存储在一个均匀连续的内存块中, # 这样数组计算遍历所有的元素,不像列表list还需要对内存地址进行查找,从而节省了计算资源。 # 有两个重要的对象: # ndarray - N-dimensional array object # ndarray实际上是多维数组的含义 import numpy as np print('# 用array函数创建数组:') a=np.array([1,2,3]) b=np.array([[1,2,3], [4,5,6], [7,8,9]]) b[1,1]=10 print(a.shape) # (3,) print(b.shape) # (3, 3) print(a.dtype) # int64 print(a) # [1 2 3] print(b) # [[ 1 2 3] # [ 4 10 6] # [ 7 8 9]] print('\n# 用dtype定义结构类型:') persontype=np.dtype({ 'names':['name','age','chinese','math','english'], 'formats':['S32','i','i','i','f'] }) # 定义数组时指定了结构数组的类型dtype=persontype。 peoples=np.array([ ("zhangfei",32,78,89,90), ("zhaoyun",23,87,98,69), ("guanyu",27,77,88,99), ("zhaosi",32,79,89,99)], dtype=persontype) ages = peoples[:]['age'] chineses = peoples[:]['chinese'] maths = peoples[:]['math'] englishs = peoples[:]['english'] print(peoples) print(np.mean(ages)) # 28.5 print(np.mean(chineses)) # 80.25 print(np.mean(maths)) # 91.0 print(np.mean(englishs)) # 89.25 print('\n# ufunc - universal function object:') # 对数组中每个元素进行函数操作 # 使用arange、linspace函数创建连续数组,等差数组 # 这两个结果一样,但是创建方式不一样。 x1=np.arange(1,11,2) # 定义初始值、最终值、步长 x2=np.linspace(1,9,5) # 定义初始值、最终值、元素个数,默认是包括最终值的。 print(x1) # [1 3 5 7 9] print(x2) # [1. 3. 5. 7. 9.] print('\n算术运算:') # 进行加减乘除、求n次方、取余数运算 print(np.add(x1,x2)) # [ 2. 6. 10. 14. 18.] print(np.subtract(x1,x2)) # [0. 0. 0. 0. 0.] print(np.multiply(x1,x2)) # [ 1. 9. 25. 49. 81.] print(np.divide(x1,x2)) # [1. 1. 1. 1. 1.] print(np.power(x1,x2)) # x1的x2次方 # [1.00000000e+00 2.70000000e+01 3.12500000e+03 8.23543000e+05 # 3.87420489e+08] print(np.remainder(x1,x2)) # remainder和mod是一样的效果,取余 print(np.mod(x1,x2)) # [0. 0. 0. 0. 0.] print('\n统计函数:') a=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(a) print(np.amin(a)) # 数组/矩阵中的元素沿指定轴的最小值 # 1 print(np.amin(a,0)) # axis=0,列的概念,把a看成三个元素[1,4,7],[2,5,8],[3,6,9] # 取出每个元素中最小值 # 即[1 2 3] print(np.amin(a,1)) # [1 4 7] 行中最小值 print(np.amax(a)) # 数组/矩阵中最大值 # 9 print(np.amax(a,0)) # [7 8 9] 列中最大值 print(np.amax(a,1)) # [3 6 9] 行中最大值 print('\n统计最大值与最小值之差ptp()') a=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(np.ptp(a)) # 9-1=8 print(np.ptp(a,0)) # 最大值的列[7,8,9]与最小值的列[1,2,3]之差为[6 6 6] print(np.ptp(a,1)) # 最大值的行[3,6,9]与最小值的行[1,4,7]之差为[2 2 2] print('\n统计数组的百分位数percentile()') # percentile代表 print(a) print(np.percentile(a,0)) # 0表示最小值 print(np.percentile(a,50)) # 50表示求平均值 print(np.percentile(a,50,axis=0)) # 对列求平均值[4. 5. 6.] print(np.percentile(a,50,axis=1)) # 对行求平均值[2. 5. 8.] print('\n统计数组的中位数median()、平均数mean()') print(a) print(np.median(a)) print(np.median(a,axis=0)) # 列的中位数[4. 5. 6.] print(np.median(a,axis=1)) # 行的中位数[2. 5. 8.] print(np.mean(a)) print(np.mean(a,axis=0)) # 列的平均值[4. 5. 6.] print(np.mean(a,axis=1)) # 行的平均值[2. 5. 8.] print('\n统计数组的加权平均值average()') a=np.array([1,2,3,4]) wts=np.array([1,2,3,4]) print(np.average(a)) # 2.5 print(np.average(a,weights=wts)) # (1*1+2*2+3*3+4*4)/(1+2+3+4)=3 # 3.0 print('\n统计数组的标准差std()、方差var()') print(a) # [1 2 3 4] # 1、标准差:方差的算术平方根,代表的是一组数据离平均值的分散程度 print(np.std(a)) # 1.118033988749895 # 2、方差:每个数值和平均值之差的平方求和的平均值mean((x-x.mean(a))**2) # mean((1-2.5)^2+(2-2.5)^2+(3-2.5)^2+(4-2.5)^2) print(np.var(a)) # 1.25 print('\nnumpy排序') a=np.array([[4,3,2], [2,4,1]]) print(a) print('np.sort(a):') print(np.sort(a)) # [[2 3 4] # [1 2 4]] print('np.sort(a,axis=None),不根据轴来排序,变成了一个列表:') print(np.sort(a,axis=None)) # [1 2 2 3 4 4] print('\nnp.sort(a,axis=0): 根据列来排序') print(np.sort(a,axis=0)) # [[2 3 1] # [4 4 2]] print('\nnp.sort(a,axis=1): 根据行来排序') print(np.sort(a,axis=1)) # [[2 3 4] # [1 2 4]] print('\nnp.sort(a,axis=-1,kind="quicksort",order=None):') print(np.sort(a,axis=-1,kind='quicksort',order=None)) # 默认使用的是快速排序。 # [[2 3 4] # [1 2 4]] print(''' \n练习题:统计全班成绩 假设一个团队里有5名学员,成绩如下表所示。你可以用NumPy 统计下这些人 在语文、英语、数学中的平均成绩、最小成绩、最大成绩、方差、标准差。 然后把这些人的总成绩排序,得出名次进行成绩输出 ''') persontype=np.dtype({ 'names':['name','chinese','english','math'], 'formats':['S32','i','i','i'] }) students=np.array([ ("zhangfei",66,65,30), ("guanyu",95,85,98), ("zhaoyun",93,92,96), ("huangzhong",90,88,77), ("dianwei",80,90,90) ],dtype=persontype) names =students[:]['name'] chineses=students[:]['chinese'] englishs=students[:]['english'] maths =students[:]['math'] def student(name,subject): print(name,':',np.average(subject), np.min(subject), np.max(subject), round(np.var(subject),2), round(np.std(subject),2)) print("科目 | 平均成绩 | 最小成绩 | 最大成绩 | 方差 | 标准差") student("语文",chineses) student("英语",englishs) student("数学",maths) print('rank:') print(sorted(students, key=lambda x:x[1]+x[2]+x[3], reverse=True))

     

    Processed: 0.010, SQL: 9