迄今为止,大家已经学习了Python中一些常用的数据结构,如字符串、元祖、列表、字典……群主以温水煮青蛙的耐心慢慢引领着大家,终于来到了Numpy这个水深火热的沸水区!To jump or not to jump?皮糙肉厚的群主已经为大家试过水温,经验表明,不脱一层皮是爬不出来的……
Numpy是Python的一个科学计算库,提供了矩阵运算的功能。Numpy中的ndarray(多维数组)数据结构可用来表示向量(1-dimension)和矩阵(N-dimension)。和Numpy中的Array比起来,List这种小白的数据结构可以说是Too simple, sometimes naive。先放一张图给大家感受一下群主最津津乐道的数组切片操作,看懂这些,保证你整个人都升华了!(可参考《跟老齐学Python轻松入门》P56~P58了解列表的索引和切片用法)
虽然装完逼就跑的感觉很刺激,但本着不离不弃的原则,群主依然会耐心带领大家,一步一个脚印走过这片暗流涌动的沼泽地。既然大家对Numpy的Array已有了感性认识,下面从最简单的开始,安抚大家受到惊吓的小心灵:)
01
Numpy arrays基本操作
- 元素索引
一维数组的元素访问方式和列表的元素访问语法一样:
- 数组和列表的区别
最重要的区别是:数组是“同质的”,即所有元素必须为同一类型,而列表中的元素可以为任意不同类型,例如可以把上面列表中最后一个元素改为字符串型,而贸然改变数组中元素类型则会报错!
- 数组的属性
数组中元素类型的信息包含在dtype属性里。
一旦数组被创建,它的dtype就固定了,只能增加相同类型的元素。此例中dtype是整数,如果我们存储一个浮点数它将被自动转换成整数:
- 创建数组
上面我们用一个列表来初始化数组,此外还有很多其他创建数组的方式。现实中常需用常量来初始化数组,例如0或1(分别作为加法或乘法运算的初始值),Numpy的zeros和ones函数即为了解决这一需求。
也可以先初始化为空值,再填充具体值。
- 定义序列
Numpy提供arange函数,和Python内置的range函数类似,但返回的是数组而不是列表。
linspace和logspace函数创建线性和对数空间的坐标序列,需指定将要创建的点数,以及区间的左右端点。
- 随机数组
创建遵从特定分布规律的随机数构成的数组也很有用。np.random模块中有很多函数能实现这类需求。
- 用布尔数组做索引
和Python中列表类似,上面我们都是用单个数字做索引或切片来访问数组中的特定元素。此外,数组还支持另一种更加强大的索引方式:用布尔值数组来做索引。这种索引方式在需要提取出满足特定条件的数组元素时非常有用。
例如,我们想把数组norm10中所有大于9的元素都替换为0,首先需要找到判断是否满足条件的布尔值数组(mask)。
有了mask,我们就可以用它来读取数组中满足条件(对应布尔值为True)的元素,并把这些元素置为0。
下周介绍多维数组的切片、数学运算以及线性代数运算,敬请期待!