数据分析实战 45 讲
陈旸
清华大学计算机博士
123928 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

04丨Python科学计算:用NumPy快速处理数据

标准差std()、方差var()
加权平均值average()
中位数median()、平均数mean()
百分位数percentile()
统计最大值与最小值之差 ptp()
最大值函数amax(),最小值函数amin()
ufunc运算
结构数组
创建数组
NumPy排序
统计函数
算数运算
连续数组的创建
ndarray对象
列表list vs. NumPy数组
数据结构比Python列表更高级、更高效
数组的使用
数组结构
练习题:统计全班的成绩
总结
NumPy
Python基本语法
Python科学计算:用NumPy快速处理数据
参考文章

该思维导图由 AI 生成,仅供参考

上一节我讲了 Python 的基本语法,今天我来给你讲下 Python 中一个非常重要的第三方库 NumPy。
它不仅是 Python 中使用最多的第三方库,而且还是 SciPy、Pandas 等数据科学的基础库。它所提供的数据结构比 Python 自身的“更高级、更高效”,可以这么说,NumPy 所提供的数据结构是 Python 数据分析的基础。
我上次讲到了 Python 数组结构中的列表 list,它实际上相当于一个数组的结构。而 NumPy 中一个关键数据类型就是关于数组的,那为什么还存在这样一个第三方的数组结构呢?
实际上,标准的 Python 中,用列表 list 保存数组的数值。由于列表中的元素可以是任意的对象,所以列表中 list 保存的是对象的指针。虽然在 Python 编程中隐去了指针的概念,但是数组有指针,Python 的列表 list 其实就是数组。这样如果我要保存一个简单的数组[0,1,2],就需要有 3 个指针和 3 个整数的对象,这样对于 Python 来说是非常不经济的,浪费了内存和计算时间。

使用 NumPy 让你的 Python 科学计算更高效

为什么要用 NumPy 数组结构而不是 Python 本身的列表 list?这是因为列表 list 的元素在系统内存中是分散存储的,而 NumPy 数组存储在一个均匀连续的内存块中。这样数组计算遍历所有的元素,不像列表 list 还需要对内存地址进行查找,从而节省了计算资源。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

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-21
    8
    64
  • 么春‮脸小的你了亲并‭
    排名第一的同学是用 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-20
    9
    109
  • Zahputor
    老师你好,我想问一下axis=0,axis=1,这个应该怎么理解?看得不是很明白

    作者回复: axis=0 是跨行(纵向),axis=1 是跨列(横向)

    2018-12-21
    6
    68
  • Kylin
    基本上…没听懂,一脸懵逼的听完了,老师还能抢救一下吗?是缺点什么基础知识?

    作者回复: 联系编辑,加微信群,我和你电话沟通下,制定学习计划。你也可以把你的情况和遇到的问题,写在评论区里。这样我解答,更多人可以看到

    2018-12-24
    4
    44
  • 蜉蝣
    关于axis参数的问题,我也有点模糊,后来知乎上看到这篇文章,思路清晰多了,也推荐大家看一下:https://zhuanlan.zhihu.com/p/30960190

    作者回复: 多谢蜉蝣分享

    2019-03-24
    12
  • 何楚
    #!/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-21
    7
    12
  • 从未在此
    根据我在网上找的学习资料,axis=0,代表跨行;=1代表跨列,这样很容易理解。

    作者回复: 对的 理解正确

    2018-12-21
    2
    9
  • Ben
    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("科目 | 平均成绩 | 最小成绩 | 最大成绩 | 方差 | 标准差") 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-01
    7
  • 夕子
    一、为什么用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-21
    2
    5
  • 抢地瓜的阿姨
    Dataframe 即将登场!哈哈哈

    作者回复: 哈哈哈 是的

    2018-12-22
    4
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部