《利用python进行数据分析》学习笔记一:Numpy模块(上)

Numpy基础:《利用python进行数据分析》学习笔记

**前言:**时隔两年,重新开始python的学习,之前的学习中断原因,自我总结下:
一是初入职场,确实有点不适应,一下班就想在床上躺尸,没有学校里的学习精力了;
二是当时的工作中还是没有使用python的场景,但现在的工作需要使用python和其他的一些软件进行分析,所以重新回来学习是必须的,也正好是一个契机,在工作两年的现在,确实需要重拾学习的能力;
三是python的内容现在纷繁复杂,虽然之前学习过VB、R,算是有了一定的基础,但是在学习python的时候还是没有找到正确的方法,选择从细节开始一步步往前艰难前行,如果能坚持下去的话当然也不失为基础扎实的学习方式,但很显然,我不是那么有毅力的人,所以失败了。
所以,这次吸取教训,选择项目和书本理论学习同时进行,正好公司有几乎可以看到前辈写的代码,就从理解前辈的实战项目代码和啃下这本薄一些的书这两方面进行这次的学习,至于那两本大部头的《python学习手册》就当作工具书使用好了,希望在离开这次的公司前能够学到足够的深度(机器学习入门)
正好最近在看《如何阅读一本书》,感觉受益良多,这次的学习笔记就根据它的建议来好了,先繁琐点,后面熟练了再精简好吧。
因为我打算一大章一大章进行学,就把这一章看作一本完整的书了。
一、第一阶段:书在谈论些什么

  1. 书的种类和主题:
    论述性的实用性书籍(这是废话,后面不说了。。。)

  2. 简要总结书在谈论些什么
    Numpy作为python在数值计算中最重要的基础包之一,本书希望介绍大部分的数据分析中Numpy可以起到的部分作用,而暂时不涉及Numpy的高级特性;

  3. 主要部分按顺序与关联性联结起来,列出大纲:
    (1)简单介绍numpy的特性和优缺点
    (2)Numpy的特殊数组:ndarray数组
    (3)ndarray的方法
    (4)ndarray的函数
    (5)使用ndarray进行面向数组编程的介绍(不同的数学情况)
    (6)使用数组进行文件的输入和输出
    (7)线性代数、伪随机数模块的介绍
    (8)示例:随机漫步模拟

  4. 确定作者想解决的问题:
    本书主要想帮助读者在面对以下数据分析的情况时可以正确的使用Numpy进行处理
    (1)在数据处理、清洗、构造子集、过滤、变换以及其他计算中进行快速的向量化计算
    (2)常见的数组算法
    (3)高效的描述性统计和聚合/概述数据
    (4)数据排列和相关数据操作
    (5)使用数组表达式来表明条件逻辑
    (6)分组数据的操作(聚合、变换以及函数式操作)

第二部分,诠释一本书的内容规则(这部分技术性的书的阅读细则我还没看到,暂时选择根据书的脉络进行重点类型的批注和代码的测试好了)

Numpy主要包含的内容概述:

(1)ndarrary数组:一种高效的多维数组,功能包括便捷的算术操作异(后面会介绍)以及灵活的广播功能(暂时不会涉及)
(2)对数据进行快速的矩阵计算而不用使用循环程序(这个好耶)
(3)对硬盘中的数组进行读写操作,对内存映射文件进行操作(*内存映射文件是?不是真实储存在内存中而只是储存了一个引用的文件?*)
(4)线性代数、随机数生成以及傅里叶变换功能
(5)C语言API(所以数据传递给底层语言编写的外部数据类库,再将外部数据类库的计算结果按照Numpy数组方式返回是很方便的;同样,这个特性使得Numpy可以对C、C++、Fortran的代码库进行封装、并为它们提供动态、易用的接口)

缺点(也许):Numpy本身并不包含建模和科学函数,但理解Numpy数组对后面学习Pandas会有帮助;
优点(应该):

  1. Numpy的设计对于含有大量数组的数据非常有效;

  2. Numpy在内部将数据储存在连续的内存块上(????),这与其他的Python内建数据结构不同。

  3. Numpy的算法库是C语言写的(我们中出了一个叛徒。。。),所以数据操作内存时,不需要进行类型检查或其他管理操作(没内味了啊)

  4. Numpy数组使用的内存量也小于其他python内建序列
    《利用python进行数据分析》学习笔记一:Numpy模块(上)_第1张图片

  5. Numpy可以对全量数组进行复杂计算而不用写循环。

ndarray数组:多维数组对象

1概述
作为Numpy的核心特征之一,ndarray是一个快速且灵活的大型数据的多维同类集容器(它包含的每一个数据都是相同类型的);它允许在整块数组数据上进行类似标量的数学计算(不是将数组进行矢量计算):《利用python进行数据分析》学习笔记一:Numpy模块(上)_第2张图片
每个数组都含有一个shape属性,表示数组的每一维度的数量(没太理解,我暂时理解是类似表示矩阵的n1n2n3…,根据后面的内容好像不太对),以及一个dtype属性,表示数组的数据类型;

2.生成ndarray数组
(1)生成数组最简单的方式是函数array,后接任意的序列型对象(包括其他的ndarray数组),生成一个新的包含传递数据的Numpy数组(1,什么是传递数据,待确认;2,是生成一个新的数组,不会覆盖原序列型对象);
除非显式的指定,否则Numpy会自动推断生成的数据类型,数据类型会被储存在一个特殊的元数据的type中(即表示数据的数据):
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第3张图片
(2)使用类似zeros一类的函数创建新数组:
同一类的函数有:ones\ones_like\zeros\zeros_like\empty\empty_like\full\full_like
以及eye,identity:生成一个N*N的特征矩阵(对角线元素是1)
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第4张图片
ones_like函数
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第5张图片
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第6张图片
(3)使用arange函数:这是Python中range函数的Numpy版本;

3.ndarray数组的数据类型
使用astype方法可以显式地转换数组的数据类型(需要注意的是该方法同样会生成一个新的数组而不是在原数组上修改),甚至可以将表达数字的字符串的类型改为数字(但是需要小心的是Numpy可能会修正它的大小或者删除输入而不发出警告,这岂不是很坑。。。谁会用啊)
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第7张图片
当然也可以使用另一个数组的dtype属性,使用astype时总是生成一个新的数组(可以看到原数组的dtype属性并没有改变):
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第8张图片
在这里插入图片描述
在这里插入图片描述

也可以使用类型代码来传入数据类型:
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第9张图片
Numpy数组算术
ndarray数组允许对它进行批量操作而不用for循环来实现,这种特性被称之为向量化,在任何两个同等尺寸的数组之间的算术操作都是对逐个元素进行的操作:《利用python进行数据分析》学习笔记一:Numpy模块(上)_第10张图片
同等尺寸的数组之间的比较则会生成一个布尔值数组(不同尺寸的数组的比较会用到广播特性,在附录里,我就先不看了~~):《利用python进行数据分析》学习笔记一:Numpy模块(上)_第11张图片
数组的索引和切片
ndarray数组的切片和索引操作和numpy的列表等其他序列操作没有什么不同,需要特别注意的是,数组的切片是原数组的视图(这句话没懂,先放着,后面的意思还是可以理解的),所以对ndarray数组切片的赋值和修改,会直接反映到原数组上《利用python进行数据分析》学习笔记一:Numpy模块(上)_第12张图片
和numpy以及其他数组语言在这种情况下趋向于选择复制不同,Numpy是因为被设计来处理非常大的数组,所以,如果选择复制的话,会对运行时的内存造成很大的压力。
面对高维的数组,单个元素可以使用递归的方式获得,和python的列表操作也是类似,不过,在数组中,以下的两种写法的结果是一样的:《利用python进行数据分析》学习笔记一:Numpy模块(上)_第13张图片
对于高维的数组,标量和数组就都可以传递给它了(图没截完,不过意思很明显了,懒得再截一次了~):《利用python进行数据分析》学习笔记一:Numpy模块(上)_第14张图片
数组的切片操作也有水到渠成的意思,和列表的操作也是基本类似:《利用python进行数据分析》学习笔记一:Numpy模块(上)_第15张图片
不过应该因为我的理解还没到位,这里我仍然有一个疑问,在我的理解中,arr2d[:,0] arr2d[:,:1]这两者应该时一个意思,但实际确实有区别的,两者的维度时不同的,百思不得其解,先放在这,等后面理解了再回来补上,或者有哪位能直接给我解惑,拜谢~
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第16张图片
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第17张图片
当然,和前面的索引一样,但还是要提醒下,对切片的修改也是会反映到原数组上的:《利用python进行数据分析》学习笔记一:Numpy模块(上)_第18张图片
布尔索引
简单来说就是用布尔值True还是False来索引,简单的
一个数组和单个数组或者字符串或者其他比较也是会生成一个布尔值数组:《利用python进行数据分析》学习笔记一:Numpy模块(上)_第19张图片
布尔值的数组可以用来索引:
注意!!!:布尔值索引数据和之前不同,是会生成数据拷贝的,返回的数组是不会有仍任何变化的!!《利用python进行数据分析》学习笔记一:Numpy模块(上)_第20张图片
但是布尔值数组的长度必须和数组轴索引长度(???这时什么意思)一致,当布尔值的长度不正确时,布尔值选择数据的方法并不会报错(这里我理解的似乎不太对,我创建一个只有1*3的布尔值数组,长度和data数组不同,索引直接报错:)
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第21张图片
所以布尔值的长度还是必须一致的,不一致的话布尔值选择数据的方法是报错的?至少实例是这样的。。。。

布尔值索引也可以取反,下面两种取反方式都可以:
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第22张图片
而对多个布尔条件进行联合时,需要使用数学符号例如
&:表示and
| : 表示 or
使用python的关键字 and和or是没有作用的,需要用符号:
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第23张图片
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第24张图片
利用常识来设置布尔值数组的值也是可以的(我也想不起来有什么好的词可以代替这个“常识”。。。看例子吧,好理解的)
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第25张图片
神奇索引
也就是利用整数数组来进行索引:
对于需要特定顺序的子集,可以使用包含指定顺序的列表或者数组来进行索引:([4,3,0,6]表示按照第5、4、1、7行的顺序)
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第26张图片
如果使用负数索引,则表示从底部反向索引:
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第27张图片
传递多个索引数组的情况如下,会根据左边的索引条件依次进行下一步索引(我觉得实际情况和我想得一样,反而是书本上作者提出的例子我没懂是为什么,先把例子放这,后面再看看能不能理解):
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第28张图片
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第29张图片
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第30张图片
数组转置和换轴
数组的转置(T属性)和矩阵的比较类似,需要注意的是返回的是视图而不需要先对数据进行复制:《利用python进行数据分析》学习笔记一:Numpy模块(上)_第31张图片
计算矩阵内积可以使用这个方法:《利用python进行数据分析》学习笔记一:Numpy模块(上)_第32张图片
T需要大写,python是区分大小写的:
《利用python进行数据分析》学习笔记一:Numpy模块(上)_第33张图片
数组还有transpose方法,可以接收包含轴标号的元组,用于置换轴:《利用python进行数据分析》学习笔记一:Numpy模块(上)_第34张图片
这里如果觉得不好理解的话可以使用下标的方式将里面的数换做如a111,a112,这种类型的代数,试一下就好理解了。

数组还有一个swapsxes方法,接收一对轴标号作为参数,并对轴进行调整用于重组数据(今晚没时间了,明天代码试一下看看是不是和我理解的一样):

你可能感兴趣的:(笔记,python)