哪儿有Numpy c#项目实战战分析?

入门Python数据分析最好的实战项目(一)入门Python数据分析最好的实战项目(一)五约房产百家号首先导入要使用的科学计算包numpy,pandas,可视化matplotlib,seaborn,以及机器学习包sklearn。然后导入数据,并进行初步的观察,这些观察包括了解数据特征的缺失值,异常值,以及大概的描述性统计。初步观察到一共有11个特征变量,Price在这里是我们的目标变量,然后我们继续深入观察一下。发现了数据集一共有23677条数据,其中Elevator特征有明显的缺失值。上面结果给出了特征值是数值的一些统计值,包括平均数,标准差,中位数,最小值,最大值,25%分位数,75%分位数。这些统计结果简单直接,对于初始了解一个特征好坏非常有用,比如我们观察到Size 特征的最大值为1019平米,最小值为2平米,那么我们就要思考这个在实际中是不是存在的,如果不存在没有意义,那么这个数据就是一个异常值,会严重影响模型的性能。当然,这只是初步观察,后续我们会用数据可视化来清晰的展示,并证实我们的猜测。我们发现Id特征其实没有什么实际意义,所以将其移除。由于房屋单价分析起来比较方便,简单的使用总价/面积就可得到,所以增加一个新的特征PerPrice(只用于分析,不是预测特征)。另外,特征的顺序也被调整了一下,看起来比较舒服。对于区域特征,我们可以分析不同区域房价和数量的对比。使用了pandas的网络透视功能groupby分组排序。区域特征可视化直接采用seaborn完成,颜色使用调色板palette参数,颜色渐变,越浅说明越少,反之越多。可以观察到:·二手房均价:西城区的房价最贵均价大约11万/平,因为西城在二环以里,且是热门学区房的聚集地。其次是东城大约10万/平,然后是海淀大约8.5万/平,其它均低于8万/平。·二手房房数量:从数量统计上来看,目前二手房市场上比较火热的区域。海淀区和朝阳区二手房数量最多,差不多都接近3000套,毕竟大区,需求量也大。然后是丰台区,近几年正在改造建设,有赶超之势。·二手房总价:通过箱型图看到,各大区域房屋总价中位数都都在1000万以下,且房屋总价离散值较高,西城最高达到了6000万,说明房屋价格特征不是理想的正太分布。·Size 分布:通过distplot和kdeplot绘制柱状图观察 Size 特征的分布情况,属于长尾类型的分布,这说明了有很多面积很大且超出正常范围的二手房。·Size 与 Price 的关系:通过regplot绘制了 Size 和 Price 之间的散点图,发现 Size 特征基本与Price呈现线性关系,符合基本常识,面积越大,价格越高。但是有两组明显的异常点:1. 面积不到10平米,但是价格超出10000万;2. 一个点面积超过了1000平米,价格很低,需要查看是什么情况。经过查看发现这组数据是别墅,出现异常的原因是由于别墅结构比较特殊(无朝向无电梯),字段定义与二手商品房不太一样导致爬虫爬取数据错位。也因别墅类型二手房不在我们的考虑范围之内,故将其移除再次观察Size分布和Price关系。经观察这个异常点不是普通的民用二手房,很可能是商用房,所以才有1房间0厅确有如此大超过1000平米的面积,这里选择移除。重新进行可视化发现就没有明显的异常点了。这个特征真是不看不知道,各种厅室组合搭配,竟然还有9室3厅,4室0厅等奇怪的结构。其中,2室一厅占绝大部分,其次是3室一厅,2室2厅,3室两厅。但是仔细观察特征分类下有很多不规则的命名,比如2室一厅与2房间1卫,还有别墅,没有统一的叫法。这样的特征肯定是不能作为机器学习模型的数据输入的,需要使用特征工程进行相应的处理。精装 11345简装 8497其他 3239毛坯 576南北20Name: Renovation, dtype:int64发现Renovation装修特征中竟然有南北,它属于朝向的类型,可能是因为爬虫过程中一些信息位置为空,导致“Direction”朝向特征出现在这里,所以需要清除或替换掉。观察到,精装修的二手房数量最多,简装其次,也是我们平日常见的。而对于价格来说,毛坯类型却是最高,其次是精装修。初探数据的时候,我们发现Elevator特征是有大量缺失值的,这对于我们是十分不利的,首先我们先看看有多少缺失值:Elevator缺失值数量为:8237这么多的缺失值怎么办呢?这个需要根据实际情况考虑,常用的方法有平均值/中位数填补法,直接移除,或者根据其他特征建模预测等。这里我们考虑填补法,但是有无电梯不是数值,不存在平均值和中位数,怎么填补呢?这里给大家提供一种思路:就是根据楼层 Floor 来判断有无电梯,一般的楼层大于6的都有电梯,而小于等于6层的一般都没有电梯。有了这个标准,那么剩下的就简单了。结果观察到,有电梯的二手房数量居多一些,毕竟高层土地利用率比较高,适合北京庞大的人群需要,而高层就需要电梯。相应的,有电梯二手房房价较高,因为电梯前期装修费和后期维护费包含内了(但这个价格比较只是一个平均的概念,比如无电梯的6层豪华小区当然价格更高了)。在Renovation和Elevator的分类条件下,使用FaceGrid分析 Year 特征,观察结果如下:·整个二手房房价趋势是随着时间增长而增长的;·2000年以后建造的二手房房价相较于2000年以前有很明显的价格上涨;·1980年之前几乎不存在有电梯二手房数据,说明1980年之前还没有大面积安装电梯;·1980年之前无电梯二手房中,简装二手房占绝大多数,精装反而很少;可以看到,6层二手房数量最多,但是单独的楼层特征没有什么意义,因为每个小区住房的总楼层数都不一样,我们需要知道楼层的相对意义。另外,楼层与文化也有很重要联系,比如中国文化七上八下,七层可能受欢迎,房价也贵,而一般也不会有4层或18层。当然,正常情况下中间楼层是比较受欢迎的,价格也高,底层和顶层受欢迎度较低,价格也相对较低。所以楼层是一个非常复杂的特征,对房价影响也比较大。本次分享旨在让大家了解如何用Python做一个简单的数据分析,对于刚刚接触数据分析的朋友无疑是一个很好的练习。不过,这个分析还存在很多问题需要解决,比如:·解决爬虫获取的数据源准确度问题;·需要爬取或者寻找更多好的售房特征;·需要做更多地特征工程工作,比如数据清洗,特征选择和筛选;·使用统计模型建立回归模型进行价格预测;本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。五约房产百家号最近更新:简介:提供房产界最新资讯,剖析房产本质作者最新文章相关文章Python数据分析之numpy | 机器之心
PythonnumpyPython数据分析之numpy前言刚开始学习数据挖掘时,有时总是对numpy和pandas傻傻分不清楚,这个问题在训练模型阶段输入训练数据的时候最为明显,下面就来详细介绍下numpy&NumpyWHAT?numpy是专门为科学计算设计的一个python扩展包,为python提供高效率的多维数组,也被称为面向阵列计算(array oriented computing),同时numpy也是github上的一个开源项目:,numpy是基于c语言开发,所以这使得numpy的运行速度很快,高效率运行就是numpy的一大优势。首先&我们要导入numpy包,一般我们都把它命名为np:In [1]: import numpy as np 接着就可以生成一个numpy一维数组:&In [2]: a = np.array([[1,2,3]],dtype=np.int32)
Out[3]: array([1, 2, 3]) numpy中定义的最重要的数据结构是称为ndarray的n维数组类型,这个结构引用了两个对象,一块用于保存数据的存储区域和一个用于描述元素类型的dtype对象:&WHY?二维数组的生成在python中我们还可以用到list列表,如果用list来表示[1,2,3],由于list中的元素可以是任何对象,所以list中保存的是对象的指针,如果要保存[1,2,3]就需要三个指针和三个整数对象,是比较浪费内存资源和cpu计算时间的,而ndarray是一种保存单一数据类型的多维数组结构,在数据处理上比list列表要快上很多,在这里我们可以用%timeit命令来检测两者的数据处理速度:&In [9]: a = range(1000)
In [10]: %timeit[i**2 for i in a]
381 &s & 6.1 &s per loop (mean & std. dev. of 7 runs, 1000 loops each)
In [11]: b = np.arange(1000)
In [12]: %timeit b**2
1.41 &s & 18 ns per loop (mean & std. dev. of 7 runs, 1000000 loops each) 由于相同数据大小的array运算直接作用到元素级上这一numpy特性,结果显而易见,在数据处理上numpy数组比使用for循环的list列表快的不是一点两点。&HOW?OK,知道了numpy大概是个什么东西,下面我们就来介绍下numpy数组的一些常用操作:这里生成一个3&3的矩阵作为例子:In [2]: data = np.array([[1,2,3],[4,5,6],[7,8,9]]) #等价于data=np.arange(1,10).reshape(3,3)
In [3]: data
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) 查看矩阵信息:&In [6]: data.shape
#返回元组,表示n行n列
Out[6]: (3, 3)
In [7]: data.dtype
#返回数组数据类型
Out[7]: dtype('int32')
In [8]: data.ndim
#返回是几维数组
Out[8]: 2 转换数据类型:In [11]: a = data.astype(float)
#拷贝一份新的数组
In [12]: a.dtype
Out[12]: dtype('float64')数组之间的计算:In [15]: data+data
array([[ 2,
[ 8, 10, 12],
[14, 16, 18]])
In [16]: data*data
array([[ 1,
[16, 25, 36],
[49, 64, 81]])可以看出相同规格的数组计算是直接作用在其元素级上的,那不同的规格的数组是否能进行运算呢,我们来看下这个例子:In [18]: data1 = np.array([[1,2],[1,2]])
#生成一个2x2numpy数组
In [19]: data+data1
---------------------------------------------------------------------------
ValueError
Traceback (most recent call last)
&ipython-input-19-f& in &module&()
----& 1 data+data1
ValueError: operands could not be broadcast together with shapes (3,3) (2,2)我们可以看出不同规格的数组一起计算的话是会报出广播错误的,那是不是可以下结论了,别急我们再来看下方两个特殊例子:In [20]: data2 = np.array([[1,2,3]])
In [21]: data + data2
array([[ 2,
[ 8, 10, 12]])
In [22]: data3 = np.array([[1],[2],[3]])
In [23]: data+data3
array([[ 2,
[10, 11, 12]])data2数组的列数量与data数组相等,data3数组的行数量与data数组相等,这两个numpy数组虽然规格与data数组不一样,但却依然可以与data数组进行运算。数组的切片:In [24]: data[:2]
#沿着行(axis=0)进行索引
array([[1, 2, 3],
[4, 5, 6]])
In [25]: data[:2,:2]
#先沿着行(axis=0)进行索引,再沿着列(axis=1)进行索引
array([[1, 2],
In [26]: data[1,0:2]
#下标是从0开始
Out[26]: array([4, 5])这里需要注意的是,切片操作是在原始数组上创建一个视图view,这只是访问数组数据的一种方式。 因此原始数组不会被复制到内存中,传递的是一个类似引用的东西,与上面的astype()方法是两种不同的拷贝方式,这里我们来看一个例子:In [32]: a = data[1]
In [33]: a
Out[33]: array([4, 5, 6])
In [34]: a[:] = 0
In [35]: data
array([[1, 2, 3],
[0, 0, 0],
[7, 8, 9]])当切片对象a改变时,data的对应值也会跟着改变,这是在我们日常数据处理中有时会疏忽的一个点,最安全的复制方法是使用copy()方法进行浅拷贝:In [36]: a = data[1].copy()
In [37]: a
Out[37]: array([0, 0, 0])
In [38]: a[:]=9
In [39]: data
array([[1, 2, 3],
[0, 0, 0],
[7, 8, 9]])数组的布尔索引:In [43]: data
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [44]: data&3
array([[False, False, False],
In [45]: data[data&3]
#找出大于3的元素
Out[45]: array([4, 5, 6, 7, 8, 9])数组的逻辑表达处理:In [46]: np.where(data&3,1,0)
#大于3的标记为1,小于等于3的标记为0
array([[0, 0, 0],
[1, 1, 1],
[1, 1, 1]])数组的常用统计操作:In [47]: data.mean(axis=0)
#沿着行(axis=0)进行索引,求出其平均值
Out[47]: array([4., 5., 6.])
In [49]: data.std()
#求出全部元素的方差
Out[49]: 2.611
In [50]: (data&3).sum()
#统计数组中元素大于3的个数
Out[50]: 6
In [51]: data.any()
#数组中是否存在一个或多个true
Out[51]: True
In [52]: data.all()
#数组中是否全部数都是true
Out[52]: True
In [53]: data.cumsum(0)
#沿着行(axis=0)进行索引,进行累加
array([[ 1,
[12, 15, 18]], dtype=int32)
In [54]: data.cumprod(1)
#沿着列(axis=1)进行索引,进行累乘
56, 504]], dtype=int32)数组的排序操作:In [55]: data=np.random.randn(4,4)
In [56]: data
array([[ 1.,
[ 1., -0., -0., -0.],
[-0., -0.,
[-0., -0.,
In [57]: data.sort(0)
#沿着行(axis=0)进行索引,并进行升序排序
In [58]: data
array([[-0., -0., -1., -0.],
[-0., -0., -0., -0.],
[ 1., -0.,
In [59]: data[::-1]
array([[ 1.,
[ 1., -0.,
[-0., -0., -0., -0.],
[-0., -0., -1., -0.]])注意:直接调用数组的方法的排序将直接改变数组而不会产生新的拷贝。矩阵运算:In [62]: x=np.arange(9).reshape(3,3)
In [63]: x
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [64]: np.dot(x,x)
array([[ 15,
90, 111]])
In [65]: x.T
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])在numpy中的linalg中有还有很多矩阵运算,比如svd分解,qr分解,cholesky分解等等。numpy数据的读取和保存:In [68]: np.save('name',data)
In [69]: np.load('name.npy')
array([[-0., -0., -1., -0.],
[-0., -0., -0., -0.],
[ 1., -0.,
1.]])总结numpy的知识学到这里,就已经可以应付好日常的数据处理了,便捷的操作,高效的处理,都使得numpy成为科学计算的一大利器。才学疏浅,欢迎评论指导&参考资料:数据挖掘爱好者,关注机器学习的相关学习,从零开始记录入门学习笔记,帮助大家更好地步入AI世界数据世界的矿工,关注机器学习的相关学习,从零开始记录入门学习笔记,帮助大家更好地步入AI世界推荐文章扫一扫下载手机客户端
扫描我,关注团购信息,享更多优惠
||网络安全
| | | | | | | | | | | | | | | |
||电子电工
汽车交通| | | | | | | | | |
||投资理财
| | | | | | | | | | | | | | | | |
| | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
||外语考试
| | | | | | | | |
| 视频教程|
Python数据分析基础教程:NumPy学习指南(第2版)
用开源计算库开始Python编程,打造简洁可读、快速高效的代码!
定价:¥49.00
校园优惠价:¥39.20 (80折)
促销活动:
商品已成功飞到您的手机啦!快登录手机站看看吧!
下载客户端
> 微信关注“互动出版网”,便捷查询订单,更多惊喜天天有
原书名:NumPy beginner’s guide,second edition
原出版社:
ISBN:9上架时间:出版日期:2014 年1月开本:16开页码:226版次:1-1
所属分类:
  罕见的NumPy中文入门教程,Python数据分析首选
从最基础的知识讲起,手把手带你进入大数据挖掘领域
囊括大量具有启发性与实用价值的实战案例
《Python数据分析基础教程:NumPy学习指南(第2版)》是NumPy 的入门教程,主要介绍NumPy 以及相关的Python 科学计算库,如SciPy 和Matplotlib。本书内容涵盖NumPy 安装、数组对象、常用函数、矩阵运算、线性代数、金融函数、窗函数、质量控制、Matplotlib 绘图、SciPy 简介以及Pygame 等内容,涉及面较广。另外,Ivan Idris 针对每个知识点给出了简短而明晰的示例,并为大部分示例给出了实用场景(如股票数据分析),在帮助初学者入门的同时,提高了本书可读性。
《Python数据分析基础教程:NumPy学习指南(第2版)》适合正在找寻高质量开源计算库的科学家、工程师、程序员和定量管理分析师阅读参考。
Ivan Idris,实验物理学硕士,曾在多家公司从事Java开发、数据仓库开发和软件测试的工作,主要关注商务智能、大数据和云计算。Ivan喜欢写简洁的可测试代码,并乐于撰写有趣的技术文章,另著有《NumPy攻略:Python科学计算与数据分析》和Instant Pygame for Python Game Development How-to。个人博客:ivanidris.net。
《Python数据分析基础教程:NumPy学习指南(第2版)》
第1章 NumPy快速入门  1
1.1 Python  1
1.2 动手实践:在不同的操作系统上安装Python  1
1.3 Windows  2
1.4 动手实践:在Windows上安装NumPy、Matplotlib、SciPy和IPython  2
1.5 Linux  4
1.6 动手实践:在Linux上安装NumPy、Matplotlib、SciPy和IPython  5
1.7 Mac OS X  5
1.8 动手实践:在Mac OS X上安装NumPy、Matplotlib和SciPy  5
1.9 动手实践:使用MacPorts或Fink安装NumPy、SciPy、Matplotlib和IPython  7
1.10 编译源代码  8
1.11 数组对象  8
1.12 动手实践:向量加法  8
1.13 IPython:一个交互式shell工具  11
1.14 在线资源和帮助  14
1.15 本章小结  15
第2章 NumPy基础  16
2.1 NumPy数组对象  16
2.2 动手实践:创建多维数组  17
  NumPy,即Numeric Python的缩写,是一个优秀的开源科学计算库,并已经成为Python科学计算生态系统的重要组成部分。NumPy为我们提供了丰富的数学函数、强大的多维数组对象以及优异的运算性能。尽管Python作为流行的编程语言非常灵活易用,但它本身并非为科学计算量身定做,在开发效率和执行效率上均不适合直接用于数据分析,尤其是大数据的分析和处理。幸运的是,NumPy为Python插上了翅膀,在保留Python语言优势的同时大大增强了科学计算和数据处理的能力。更重要的是,NumPy与SciPy、Matplotlib、SciKits等其他众多Python科学计算库很好地结合在一起,共同构建了一个完整的科学计算生态系统。毫不夸张地讲,NumPy是使用Python进行数据分析的一个必备工具。
  说起NumPy,我是在数据的“赛场”上与之结缘的。出于对数据挖掘和机器学习的爱好,我与中国科学院和北京大学的同学一起组建了一支名为BrickMover的“比赛小分队”,队友包括庞亮、石磊、刘旭东、黎强、孙晗晓、刘璐等。我们先后参加了一些国内外的数据挖掘比赛,包括百度电影推荐系统算法创新大赛、首届中国计算广告学大赛暨RTB算法大赛、RecSys Challenge 2013、ICDM Contest 2013等,并且取得了还算不错的成绩。无一例外的是,这些比赛均需要对数据进行快速、全面的分析。感谢NumPy,它正是我们使用的数据分析利器之一。
  本书作为NumPy的入门教程,从安装NumPy讲起,涵盖NumPy数组对象、常用函数、矩阵运算、线性代数、金融函数、窗函数、质量控制、Matplotlib绘图、SciPy简介以及Pygame等内容,涉及面较为广泛。书中对每个知识点均给出了简短而明晰的示例,很适合初学者上手。大部分示例都有真实的应用场景(如股票数据分析),可读性远远好于枯燥的官方文档,帮助读者在掌握NumPy使用技能的同时拓宽视野、拓展思维。本书的阅读门槛不高,读者只需具备基本的Python编程知识。
  在翻译本书的过程中,我发现原作有不少地方不够严谨,甚至还有一些错误。经过反复核对确认,我已经修改了发现的错误,并在我认为不够严谨的地方以译者注的形式给出了自己的理解,供读者参考。此外,原书中的配图为屏幕截图,清晰度较低。为了读者获得最佳的阅读体验,我将书中的代码全部运行了一遍,并输出矢量图以替换原有的配图。需要说明的是,书中部分代码将会在线下载最近一年的股价数据,即数据的时间区段取决于代码运行时的日期。因此,这部分代码对应的新配图会与原书中的配图稍有差异,但对读者不会有任何影响。
  感谢我的研究生导师王斌老师的力荐,他让我有幸成为本书的译者。王老师已有《信息检索导论》《大数据:大规模互联网数据挖掘与分布式处理》《机器学习实战》等诸多译著。他并不满足于自己畅读国外的优质书籍,而是字斟句酌、不辞辛劳地完成同样优质的译作与广大中文读者共飨,这份精神让我深受鼓舞。也正因为此,我才鼓起勇气接受了这次自我挑战,不遗余力地完成了人生第一次翻译工作。在这个过程中,要感谢图灵公司的李松峰老师对译稿提出细致严谨的修改意见,感谢傅志红、朱巍、毛倩倩、程M等出版界同仁在审校、编辑阶段给予的帮助。最后,感谢我的家人,以及BrickMover Team的小伙伴们对翻译本书的支持。
  由于自己的专业水平和翻译能力十分有限,加上时间仓促,译稿中的疏漏之处在所难免,恳请读者谅解。希望读者通过新浪微博@张驭宇UCAS和个人邮箱,不吝提出宝贵的修改意见和建议,共同努力不断完善译稿。
  对于每一个期望快速了解NumPy,却又担心自己迷失在浩如烟海的官方文档中的人,这本书值得一读。
  张驭宇
  2013年11月于中关村
  第1章 NumPy快速入门
  让我们开始吧。首先,我们将介绍如何在不同的操作系统中安装NumPy和相关软件,并给出使用NumPy的简单示例代码。然后,我们将简单介绍IPython(一种交互式shell工具)。如前言所述,SciPy和NumPy有着密切的联系,因此你将多次看到SciPy的身影。在本章的末尾,我们将告诉你如何利用在线资源,以便你在受困于某个问题或不确定最佳的解题方法时,可以在线获取帮助。
  本章涵盖以下内容:
  在Windows、Linux和Macintosh操作系统上安装Python、SciPy、Matplotlib、IPython和NumPy;
  编写简单的NumPy代码;
  了解IPython;
  浏览在线文档和相关资源。
  1.1Python
  NumPy是基于Python的,因此在安装NumPy之前,我们需要先安装Python。某些操作系统已经默认安装有Python环境,但你仍需检查Python的版本是否与你将要安装的NumPy版本兼容。Python有很多种实现,包括一些商业化的实现和发行版。在本书中,我们将使用CPython 实现,从而保证与NumPy兼容。
  1.2动手实践:在不同的操作系统上安装Python
  NumPy在Windows、各种Linux发行版以及Mac OS X上均有二进制安装包。如果你愿意,也可以安装包含源代码的版本。你需要在系统中安装Python 2.4.x或更高的版本。我们将给出在以下操作系统中安装Python的各个步骤。
  (1) Debian和Ubuntu Debian和Ubuntu可能已经默认安装了Python,但开发者包(development headers) 一般不会默认安装。在Debian和Ubuntu中安装python和python-dev的命令如下:
  sudo apt-get install python
  sudo apt-get install python-dev
  (2) Windows Python的Windows安装程序可以在www.python.org/download下载。在这个站点中,我们也可以找到Mac OS X的安装程序,以及Linux、Unix和Mac OS X下的源代码包。
  (3) Mac Mac OS X中预装了Python,而我们也可以通过MacPorts、Fink或者类似的包管理工具来获取Python。举例来说,可以使用如下命令安装Python 2.7:
  sudo port install python27
  LAPACK并不是必需的,但如果需要,NumPy在安装过程中将检测并使用之。我们推荐大家安装LAPACK以便应对海量数据的计算,因为它拥有高效的线性代数计算模块。
  刚才做了些什么
  我们在Debian、Ubuntu、Windows和Mac操作系统中安装了Python。
系列图书推荐 ¥79.00¥63.20
同类热销商品¥39.00¥27.30
订单处理配送
北京奥维博世图书发行有限公司 china-pub,All Rights Reserved这是我学习北京理工大学嵩天老师的《Python数据分析与展示》课程的笔记。嵩老师的课程重点突出、层次分明,在这里特别感谢嵩老师的精彩讲解。
NumPy库入门
数据的维度
维度是一组数据的组织形式。数据维度就是在数据之间形成特定关系表达多种含义的一个概念。
一维数据由对等关系的有序或无序数据构成,采用线性方式组织。对应列表、数组和集合等概念。
列表和数组:一组数据的有序结构。
&&列表:数据类型可以不同
&&数组:数据类型相同
二维数据:
二维数据由多个一维数据构成,是一维数据的组合形式。
表格是典型的二维数据。其中,表头是二维数据的一部分
多维数据:
多维数据由一维或二维数据在新维度上扩展形成。例如增加时间维度的表格
高维数据:
高维数据仅利用最基本的二元关系展示数据间的复杂结构。利用键值对将数据组织起来的形成的数据关系。
数据维度的Python表示
一维数据:列表(有序)和集合(无序)类型
二维数据:列表类型
多维数据:列表类型
高维数据:字典类型或数据表示格式(JSON、XML、YAML)
NumPy的数组对象:ndarray
NumPy是一个开源的Python科学计算基础库。NumPy提供了一个强大的N维数组对象ndarray,广播功能函数,整合C/C++/Fortran代码的工具,线性代数、傅里叶变换、随机数生成等功能。NumPy是SciPy、Pandas等数据处理或科学计算库的基础。
Numpy引用:
import numpy as np
尽管别名可以省略或更改,建议使用上述约定的别名
引入ndarray的好处:
范例:计算A2 + B3 ,其中,A和B是一维数组
def pySum():
a = [0,1,2,3,4]
b = [9,8,7,6,5]
for i in range(len(a)):
c.append(a[i]**2 + b[i]**3)
print(pySum())
import numpy as np
def npSum():
a = np.array([0,1,2,3,4])
b = np.array([9,8,7,6,5])
c = a**2 + b**3
print(npSum())
数组对象可以去掉元素间运算所需要的循环,使一维向量更像单个数据。设置专门的数组对象,经过优化,可以提升这类应用的运算速度。
观察:科学计算中,一个维度所有数据的类型往往相同。
数组对象采用相同的数据类型,有助于节省运算和存储空间。
N维数组对象:ndarray
ndarray是一个多维数组对象,由两部分构成:实际的数据、描述这些数据的元数据(数据维度、数据类型等)。ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。
使用np.array()生成一个ndarray数组(ndarray在程序中的别名是:array),np.array()输出成 [] 形式,元素由空格分割。
轴(axis):保存数据的维度
秩(rank):轴的数量
范例:生成一个ndarray数组
In [1]: import numpy as np
In [2]: a = np.array([[0,1,2,3,4],
[9,8,7,6,5]])
array([[0, 1, 2, 3, 4],
[9, 8, 7, 6, 5]])
In [4]: print(a)
[[0 1 2 3 4]
[9 8 7 6 5]]
ndarray对象的属性
秩,即轴的数量或维度的数量
ndarray 对象的尺寸,对于矩阵,n行m列
ndarray对象元素的个数,相当于.shape中的n*m的值
ndarray对象元素类型
ndarray对象中每个元素的大小,以字节为单位
范例:测试ndarray的属性
In [5]: a.ndim
In [6]: a.shape
Out[6]: (2, 5)
In [7]: a.dtype
Out[7]: dtype('int32')
In [8]: a.itemsize
ndarray的元素类型
数据类型说明
布尔类型,True或False
与C语言中的int类型一致,一般是int32或int64
用于索引的整数,与C语言sszie_t一致,int32或int64
字节长度的整数,取值:[-128,127]
16位长度的整数,取值:[-]
32位长度的整数,取值:[-231,231-1]
64位长度的整数,取值:[-263,263-1]
8位无符号整数,取值:[0,255]
16位无符号整数,取值:[0,255]
32位无符号整数,取值:[0,232-1]
64位无符号整数,取值:[0,264-1]
16位半精度浮点数:1位符号位,5位指数,10位尾数((符号)尾数*10指数)
32位半精度浮点数:1位符号位,5位指数,23位尾数
64位半精度浮点数:1位符号位,11位指数,23位尾数
64位半精度浮点数:1位符号位,11位指数,52位尾数
复数:实部(.real) + j虚部(.imag)
复数类型,实部和虚部都是32位浮点数
complex128
复数类型,实部和虚部都是64位浮点数
对比:Python语法仅支持整数、浮点数和复数3种类型。ndarray支持多种元素类型的原因:
科学计算涉及数据较多,对存储和性能都有较高要求。
对元素类型精细定义,有助于Numpy合理使用存储空间并优化性能。
对元素类型精细定义,有助于程序员对程序规模有合理评估。
非同质的ndarray对象
ndarray数组可以由非同质对象构成。非同质ndarray元素为对象类型,无法有效发挥Numpy优势,尽量避免使用。
范例:非同质的ndarray对象的类型为Object
In [9]: x = np.array([[0,1,2,3,4],
[9,8,7,6] ])
In [10]: x.shape
Out[10]: (2,)
In [11]: x.dtype
Out[11]: dtype('O')
In [12]: x
Out[12]: array([list([0, 1, 2, 3, 4]), list([9, 8, 7, 6])], dtype=object)
In [13]: x.itemsize
Out[13]: 8
In [14]: x.size
Out[14]: 2
ndarray数组的创建和变换
ndarray数组的创建方法
(1)从Pyhton中的列表、元祖等类型创建ndarray数组。
x = np.array(list/tuple)
x = np.array(list/tuple,dtype=np.float32)
当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型。
范例:创建ndarray数组
In [15]: x = np.array([0,1,2,3])
# 从列表类型创建
In [16]: print(x)
In [17]: x = np.array((4,5,6,7))
# 从元组类型创建
In [18]: print(x)
In [19]: x = np.array([[1,2],[9,8],(0.1, 0.2)])
# 从列表和元组混合类型创建
In [20]: print(x)
(2)使用Numpy中函数创建ndarray数组,如:arange,ones,zeros等。
np.arange(n)
类似range()函数,返回ndarray类型,元素从0到n-1
np.ones(shape)
根据shape生成一个全1数组,shape是元组类型
np.zeros(shape)
根据shape生成一个全0数组,shape是元组类型
np.full(shape,val)
g根据shape生成一个数组,每个元素值都是val
创建一个正方形的n*n单位矩阵,对角线为1,其余为0
np.ones_like(a)
根据数组a的形状生成一个全1数组
np.zeros_like(a)
根据数组a的形状生成一个全0数组
np.full_like(a,val)
根据数组a形状生成一个数组,每个元素值都是val
使用Numpy中其他函数创建ndarray数组
np.linspace()
根据起止数据等间距地填充数据,形成数组
np.concatenate()
将两个或多个数组合并成一个新的数组
范例:创建ndarray数组
In [21]: np.arange(10)
Out[21]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [22]: np.ones((3,6))
array([[ 1.,
In [23]: np.zeros((3,6),dtype=np.int32)
array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
In [24]: np.eye(5)
array([[ 1.,
In [25]: x = np.ones((2,3,4))
In [26]: print(x)
In [27]: x.shape
Out[27]: (2, 3, 4)
In [28]: a = np.linspace(1, 10, 4)
In [29]: a
Out[29]: array([
In [30]: b = np.linspace(1, 10, 4, endpoint=False)
In [31]: b
Out[31]: array([ 1.
In [32]: c = np.concatenate((a,b))
In [33]: c
Out[33]: array([
(3)从字节流(raw bytes)中创建ndarray数组。
(4)从文件中读取特定格式,创建ndarray数组。
ndarray数组的变换
对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换。
ndarray数组的维度变换
.reshape(shape)
不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape)
与.reshape()功能一致,但修改原数组
.swapaxes(ax1,ax2)
将数组n个维度中两个维度进行调换
.flatten()
对数组进行降维,返回折叠后的一维数组,原数组不变
In [34]: a = np.ones((2,3,4), dtype=np.int32)
In [35]: a.reshape((3,8))
array([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])
In [36]: a
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
In [37]: a.resize((3,8))
In [38]: a
array([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])
In [39]: a = np.ones((2,3,4), dtype=np.int32)
In [40]: a.flatten()
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
In [41]: a
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
In [42]: b = a.flatten()
In [43]: b
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
ndarray数组的类型变换
new_a = a.astype(new_type)
范例:数组类型变换
In [44]: a = np.ones((2,3,4), dtype=np.int)
In [45]: a
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
In [46]: b = a.astype(np.float)
In [47]: b
array([[[ 1.,
astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致。
ndarray数组向列表的转换
ls = a.tolist()
范例:ndarray数组向列表的转换
In [48]: a = np.full((2,3,4), 25, dtype=np.int32)
In [49]: a
array([[[25, 25, 25, 25],
[25, 25, 25, 25],
[25, 25, 25, 25]],
[[25, 25, 25, 25],
[25, 25, 25, 25],
[25, 25, 25, 25]]])
In [50]: a.tolist()
[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]],
[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]
ndarray数组的操作
数组的索引和切片
索引:获取数组中特定位置元素的过程
切片:获取数组元素子集的过程
一维数组的索引和切片:与Python的列表类似
In [51]: a = np.array([9,8,7,6,5])
In [52]: a[2]
Out[52]: 7
In [53]: a[1:4:2]
# 起始编号 : 终止编号(不含) : 步长(3元素冒号分割),编号0开始从左递增,或-1开始从右递减
Out[53]: array([8, 6])
多维数组的索引:
In [54]: a = np.arange(24).reshape((2,3,4))
In [55]: a
array([[[ 0,
9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [56]: a[1,2,3]
# 每个维度一个索引值,逗号分割
Out[56]: 23
In [57]: a[0,1,2]
Out[57]: 6
In [58]: a[-1,-2,-3]
Out[58]: 17
多维数组的切片:
In [59]: a[: , 1, -3]
# 选取一个维度用
Out[59]: array([ 5, 17])
In [60]: a[: , 1:3, :]
# 每个维度切片方法与一维数组相同
array([[[ 4,
9, 10, 11]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [61]: a[: , :, ::2]
# 每个维度可以使用步长跳跃切片
array([[[ 0,
[ 8, 10]],
[[12, 14],
[20, 22]]])
ndarray数组的运算
数组与标量之间的运算
数组与标量之间的运算作用于数组的每一个元素
范例:计算a与元素平均值的商
In [62]: a.mean()
Out[62]: 11.5
In [63]: a = a/a.mean()
In [64]: a
array([[[ 0.
0.7826087 ,
1.2173913 ,
Numpy一元函数
对ndarray中的数据执行元素级运算的函数
np.abs(x) np.fabs(x)
计算数组各元素的绝对值
np.sqrt(x)
计算数组各元素的平方根
np.square(x)
计算数组各元素的平方
np.log(x) np.log10(x) np.log2(x)
计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x) np.floor(x)
计算数组各元素的ceiling值或floor值
np.rint(x)
计算数组各元素的四舍五入值
np.modf(x)
将数组各元素的小数
np.cos(x) np.cosh(x)np.sin(x) np.sinh(x)np.tan(x) np.tanh(x)
计算数组各元素的普通型和双曲型三角函数
计算数组各元素的指数值
np.sign(x)
计算数组各元素的符号值,1(+),0,-1(-)
范例:一元函数实例
In [65]: a = np.arange(24).reshape((2,3,4))
In [66]: np.square(a)
81, 100, 121]],
[[144, 169, 196, 225],
[256, 289, 324, 361],
[400, 441, 484, 529]]], dtype=int32)
In [67]: a = np.sqrt(a)
In [68]: a
array([[[ 0.
In [69]: np.modf(a)
(array([[[ 0.
array([[[ 0.,
NumPy二元函数
+ - * / **
两个数组各元素进行对应运算
np.maximum(x,y) np.fmax()np.minimum(x,y) np.fmin()
元素级的最大值/最小值计算
np.mod(x,y)
元素级的模运算
np.copysign(x,y)
将数组y中各元素值的符号赋值给数组x对应元素
& & &= &= == !=
算术比较,产生布尔型数组
范例:NumPy二元函数
In [70]: a = np.arange(24).reshape((2,3,4))
In [71]: b = np.sqrt(a)
In [72]: a
array([[[ 0,
9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [73]: b
array([[[ 0.
In [74]: np.maximum(a,b)
In [75]: a & b
array([[[False, False,
True]]], dtype=bool)
阅读(...) 评论()}

我要回帖

更多关于 python实战项目 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信