04丨Python科学计算:用NumPy快速处理数据
该思维导图由 AI 生成,仅供参考
使用 NumPy 让你的 Python 科学计算更高效
- 深入了解
- 翻译
- 解释
- 总结
NumPy是Python中一款重要的第三方库,提供了高效的数据结构,解决了标准Python中列表存储数组的不足。NumPy数组存储在连续内存块中,节省了计算资源,利用现代CPU的矢量化指令计算,提升了计算效率。本文介绍了ndarray对象的创建和处理,以及结构数组的操作。ufunc函数能对数组中每个元素进行函数操作,速度快且功能强大。NumPy还提供了连续数组的创建和各种算数运算,以及统计函数,如计算最大值、最小值、百分位数等。这些功能使得NumPy成为Python科学计算的重要工具。另外,文章还介绍了NumPy中统计数组中的中位数、平均数、加权平均值、标准差和方差的计算方法。最后,文章还提到了NumPy中排序的实现方法,通过sort函数可以轻松实现快速排序、合并排序、堆排序等。这些内容全面展示了NumPy在数据处理和科学计算中的强大功能。读者可以通过学习ndarray和ufunc对象来快速掌握NumPy的基本用法。文章重点强调了NumPy数组的定义和操作,以及其与Python列表的区别,同时提供了对数组进行算术和统计运算的功能。此外,还提供了练习题,要求读者使用NumPy统计团队成员的成绩并进行排序,以便加深对NumPy的理解和应用。
《数据分析实战 45 讲》,新⼈⾸单¥59
全部留言(332)
- 最新
- 精选
- mickey置顶#!/usr/bin/python #vim: set fileencoding:utf-8 import numpy as np ''' 假设一个团队里有5名学员,成绩如下表所示。 1.用NumPy统计下这些人在语文、英语、数学中的平均成绩、最小成绩、最大成绩、方差、标准差。 2.总成绩排序,得出名次进行成绩输出。 ''' scoretype = np.dtype({ 'names': ['name', 'chinese', 'english', 'math'], 'formats': ['S32', 'i', 'i', 'i']}) peoples = np.array( [ ("zhangfei", 66, 65, 30), ("guanyu", 95, 85, 98), ("zhaoyun", 93, 92, 96), ("huangzhong", 90, 88, 77), ("dianwei", 80, 90, 90) ], dtype=scoretype) #print(peoples) name = peoples[:]['name'] wuli = peoples[:]['chinese'] zhili = peoples[:]['english'] tili = peoples[:]['math'] def show(name,cj): print name, print " |", print np.mean(cj), print " | ", print np.min(cj), print " | ", print np.max(cj), print " | ", print np.var(cj), print " | ", print np.std(cj) print("科目 | 平均成绩 | 最小成绩 | 最大成绩 | 方差 | 标准差") show("语文", wuli) show("英语", zhili) show("数学", tili) print("排名:") ranking =sorted(peoples,cmp = lambda x,y: cmp(x[1]+x[2]+x[3],y[1]+y[2]+y[3]), reverse=True) print(ranking)
作者回复: 写的不错,大家都可以看下。这里他用到了Python自带的sorted函数,用cmp函数和lambda按照三科成绩之和进行排序,并且设置 reverse=True 进行降序排序
2018-12-21864 - 么春脸小的你了亲并排名第一的同学是用 Python 2 的写法,我用 Python 3 也写一遍,供大家参考。 # -*- coding: utf-8 -*- """ Created on Sun Jan 20 00:51:28 2019 @author: Dachun Li """ 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)) print("\npart 6 作业\n") persontype = np.dtype({ 'names':['name', 'chinese','english','math' ], 'formats':['S32', 'i', 'i', 'i']}) peoples = np.array([("ZhangFei",66,65,30),("GuanYu",95,85,98), ("ZhaoYun",93,92,96),("HuangZhong",90,88,77), ("DianWei",80,90,90)],dtype=persontype) #指定的竖列 name = peoples[:]['name'] chinese = peoples[:]['chinese'] english = peoples[:]['english'] math = peoples[:]['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("语文", chinese) show("英语", english) show("数学", math) print("排名:") #用sorted函数进行排序 ranking = sorted(peoples,key=lambda x:x[1]+x[2]+x[3], reverse=True) print(ranking)
作者回复: 我让编辑给你加精
2019-01-209109 - Zahputor老师你好,我想问一下axis=0,axis=1,这个应该怎么理解?看得不是很明白
作者回复: axis=0 是跨行(纵向),axis=1 是跨列(横向)
2018-12-21668 - Kylin基本上…没听懂,一脸懵逼的听完了,老师还能抢救一下吗?是缺点什么基础知识?
作者回复: 联系编辑,加微信群,我和你电话沟通下,制定学习计划。你也可以把你的情况和遇到的问题,写在评论区里。这样我解答,更多人可以看到
2018-12-24444 - 蜉蝣关于axis参数的问题,我也有点模糊,后来知乎上看到这篇文章,思路清晰多了,也推荐大家看一下:https://zhuanlan.zhihu.com/p/30960190
作者回复: 多谢蜉蝣分享
2019-03-2412 - 何楚#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np persontype = np.dtype({ 'names': ['name', 'chinese', 'math', 'english'], 'formats': ['S32', 'i', 'i', 'i']}) peoples = np.array([("ZhangFei", 66, 65, 30), ("GuanYu", 95, 85, 98), ("ZhaoYun", 93, 92, 96), ("HuangZhong", 90, 88, 77), ("DianWei", 80, 90, 90)], dtype=persontype) for col in peoples.dtype.names: # print(col) if col is "name": continue print("mean of {}: {}".format(col, peoples[col].mean())) print("min of {}: {}".format(col, peoples[col].min())) print("max of {}: {}".format(col, peoples[col].max())) print("var of {}: {}".format(col, peoples[col].var())) print("std of {}: {}".format(col, peoples[col].std())) report = np.empty([0, 0]) for i in range(peoples.size): sum_score = peoples['chinese'][i] + peoples['english'][i] + peoples['math'][i] #print(sum_score) report = np.append(report, [ sum_score]) report = -np.sort(-report) print("sorted score:") print(report) 怎么在 numpy 里作成绩求和还不是很清楚。另外,想把成绩和名字按排序后打印出来,要用索引,赶时间没研究,等看别人的结果。
作者回复: 你在求三科成绩的各种统计指标的时候,写的不错 你提到的如何在numpy中求和,其实在定义结构数组的时候,可以多定义一列total peoples[:]['total'] = peoples[:]['chinese']+peoples[:]['english']+peoples[:]['math'] 然后按照total进行排序即可 print np.sort(peoples, order='total')
2018-12-21712 - 从未在此根据我在网上找的学习资料,axis=0,代表跨行;=1代表跨列,这样很容易理解。
作者回复: 对的 理解正确
2018-12-2129 - Benscoretype = np.dtype({'names': ['name', 'chinese', 'english', 'math'], 'formats': ['S32', 'i', 'i', 'i']}) peoples = np.array( [ ("zhangfei", 66, 65, 30), ("guanyu", 95, 85, 98), ("zhaoyun", 93, 92, 96), ("huangzhong", 90, 88, 77), ("dianwei", 80, 90, 90) ], dtype=scoretype) print("科目 | 平均成绩 | 最小成绩 | 最大成绩 | 方差 | 标准差") courses = {'语文': peoples[:]['chinese'], '英文': peoples[:]['english'], '数学': peoples[:]['math']} for course, scores in courses.items(): print(course, np.mean(scores), np.amin(scores), np.amax(scores), np.std(scores), np.var(scores)) print('Ranking') ranking = sorted(peoples, key=lambda x: x[1]+x[2]+x[3], reverse=True) print(ranking)
作者回复: Good Job
2019-07-017 - 夕子一、为什么用numpy而不用list? ①存储上,list需要同时存储元素和指针,而numpy数组只存储元素,节省内存和计算时间。 ②list的元素在系统内存中分散存储,而numpy数组存储在一个均匀连续的内存块中,遍历元素时不需要查找内存地址,节省计算资源。 ③在内存访问模式中,缓存会直接把子节块从RAM加载到CPU寄存器中。因为数据连续的存储在内存中,numpy直接利用现代CPU的矢量化指令计算,加载寄存器中的多个连续浮点数。另外numpy中的矩阵计算可以采用多线程的方式,充分利用多核CPU计算资源,大大提升了计算效率。 二、其他数据结构类型:字典、元组、字符串 三、练习题 scoretype = np.dtype({'names':['name','chinese','english','math','total'], 'formats':['S32','i', 'i', 'i','i']}) peoples = np.array([('ZhangFei',66,65,30,0),('GuanYu',95,85,98,0),('ZhaoYun',93,92,96,0),('HuangZhong',90,88,77,0),('DianWei',80,90,90,0)], dtype=scoretype) chineses = peoples[:]['chinese'] englishes = peoples[:]['english'] maths = peoples[:]['math'] print('语文成绩:') print('平均成绩',np.mean(chineses)) print('最小成绩',np.amin(chineses)) print('最大成绩',np.amax(chineses)) print('方差',np.var(chineses)) print('标准差',np.std(chineses)) print('-'*30) print('英语成绩:') print('平均成绩',np.mean(englishes)) print('最小成绩',np.amin(englishes)) print('最大成绩',np.amax(englishes)) print('方差',np.var(englishes)) print('标准差',np.std(englishes)) print('-'*30) print('数学成绩:') print('平均成绩',np.mean(maths)) print('最小成绩',np.amin(maths)) print('最大成绩',np.amax(maths)) print('方差',np.var(maths)) print('标准差',np.std(maths)) peoples[:]['total'] = peoples[:]['chinese']+peoples[:]['english']+peoples[:]['math'] print(np.sort(peoples,order='total')) 输出结果为: 语文成绩: 平均成绩 84.8 最小成绩 66 最大成绩 95 方差 114.96000000000001 标准差 10.721940122944169 ------------------------------ 英语成绩: 平均成绩 84.0 最小成绩 65 最大成绩 92 方差 95.6 标准差 9.777525249264253 ------------------------------ 数学成绩: 平均成绩 78.2 最小成绩 30 最大成绩 98 方差 634.56 标准差 25.19047439013406 [(b'ZhangFei', 66, 65, 30, 161) (b'HuangZhong', 90, 88, 77, 255) (b'DianWei', 80, 90, 90, 260) (b'GuanYu', 95, 85, 98, 278) (b'ZhaoYun', 93, 92, 96, 281)] 我对结构数组不太熟悉,求总分那里试了对切片求和报错了,看了评论里老师的解答才知道在定义里做,这个要注意多练习。
作者回复: 总结的不错!Good Job!!!
2020-03-2125 - 抢地瓜的阿姨Dataframe 即将登场!哈哈哈
作者回复: 哈哈哈 是的
2018-12-224