第2章 NumPy数组
Python数据分析
在前面部分,我们已经安装了NumPy和几个关键Python程序库,并动手编写了一些代码。在本章中,我们将正式步入NumPy数组的世界,带领大家一起学习NumPy和数组的知识。阅读本章后,你会对NumPy数组及其相关函数有个基本了解。
本章涉及的主题如下所示。
- 数据类型。
- 数组类型。
- 类型转换。
- 创建数组。
- 索引。
- 花式索引。
- 切片(Slicing)。
- 处理数组的形状。
2.1 NumPy数组对象
NumPy中的多维数组称为ndarray,它有两个组成部分。
- 数据本身。
- 描述数据的元数据。
在数组的处理过程中,原始信息不受影响,变化的只是元数据而已。
在之前的章节中,我们曾经用arange()函数来生成数组。实际上,那是用来存放一组数值的一维数组,这里的ndarray则可以具有一个以上的维度。
NumPy数组的优势
NumPy数组通常是由相同种类的元素组成的,即数组中的数据项的类型必须一致。NumPy数组元素类型一致的好处是:由于知道数组元素的类型相同,所以能轻松确定存储数组所需空间的大小。同时,NumPy数组还能够运用向量化运算来处理整个数组;而完成同样的任务,Python的列表则通常必须借助循环语句遍历列表,并对逐个元素进行相应的处理。此外,NumPy使用了优化过的C API,所以运算速度格外快。
NumPy数组的索引方法与Python类似,下标从0开始。NumPy数组的数据类型由特殊的对象指定,本章后面的部分将对这些对象进行详细介绍。
今后,我们会经常利用arange()子例程来建立数组,该函数取自本书附带的arrayattributes.py文件。本章中的代码片断大都取自IPython会话。注意,IPython启动时会自动导入NumPy库。下面代码展示了如何获得数组的数据类型:
In: a = arange(5)
In: a.dtype
Out: dtype('int64')
以上数组的数据类型为int64(至少在作者的电脑上是这样的),不过,如果你的Python为32位版本的话,得到的结果将是int32。无论上面哪一种情况,都是在处理整型变量(64位或者32位)。对于数组,除了要知道数据类型外,还要注意其形状,这一点非常重要。在第1章“Python程序库入门”中,我们曾经举例说明向量(一维NumPy数组)的创建方法。数学家会经常用到向量,但对我们来说,最常用的却是更高维度的对象。下面来看刚刚生成的那个向量的形状:
In: a
Out: array([0, 1, 2, 3, 4])
In: a.shape
Out: (5,)
如你所见,该向量有5个元素,它们的值分别是从0到4。该数组的shape属性是一个元组(就本例而言,这是一个单元素元组),存放的是数组在每一个维度的长度。