3.1 NumPy
NumPy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。它是Python进行科学计算时所有高级工具的基础组件。NumPy的部分功能如下。
·ndarray,具有矢量算术运算的、快速且节省空间的多维数组。
·无需循环,就可以基于标准数学函数对整组数据进行快速运算。
·包含文件读写工具和内存映射文件工具。
·具有线性代数、随机数生成以及傅里叶变换等功能。
·集成了C、C++、Fortran等语言编写的工具。
·拥有C语言的API,可以与C语言编写的库互相传递数据。
NumPy的ndarray是一个多维数组对象,主要由如下两个部分组成。
·实际的数据。
·描述这些数据的元数据。
我们需要先导入NumPy库,才能使用ndarray。通常的导入方式如下:
In[10]: import numpy as np In[11]: a=np.arange(10) In[12]: type(a) Out[12]: numpy.ndarray
但在本章中,为了简洁,我们使用如下的导入方式:
In[13]: from numpy import * In[14]: a=arange(10) In[15]: type(a) Out[15]: numpy.ndarray In[5]: a Out[5]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
这样就不用在每一个NumPy的函数中加上np了,程序更为简洁。
在上面的例子中,我们使用了NumPy的函数arange(),生成了从0到9的ndarray数组。NumPy数组的下标与Python一样,也是从0开始的。这里,数组的数据类型是int32,示例代码如下:
In[7]: a.dtype Out[7]: dtype('int32')
但在有的机器中,结果可能是int64。这一点与操作系统还有Python的版本有关。
查看数组的维度,返回一个元组(tuple),可以看到,这个数组是一个长度为10的一维数据。示例代码如下:
In[10]: a.shape Out[10]: (10L,)
NumPy数组一般是同质的,即数组中所有元素的类型必须一致。
3.1.1 创建多维数组
上一节的例子中,我们创建了一个一维数据。NumPy可以支持更高的维度。下面我们就来尝试一下,示例代码如下:
In[11]: m=array([arange(4),arange(4)]) In[12]: m Out[12]: array([[0, 1, 2, 3], [0, 1, 2, 3]]) In[13]: m.shape Out[13]: (2L, 4L)
这里将arange函数创建的数组作为列表元素,将这个列表作为参数传给了array函数,从而创建了一个2×4的数组。
array函数可以依据给定的对象生成数组。给定的对象应是类数组,如Python中的列表。
3.1.2 选取数组元素
有时候我们需要选取数组中的某个元素,在NumPy中可使用下标来进行选取,下标是从0开始的。示例代码如下:
In[25]: a=array([arange(1,5),arange(5,9)]) In[26]: a Out[26]: array([[1, 2, 3, 4], [5, 6, 7, 8]])
在这里,我们创建了一个2×4的数组。元素的示例代码如下:
In[27]: a[0,0] Out[27]: 1 In[28]: a[0,1] Out[28]: 2 In[29]: a[0,2] Out[29]: 3 In[30]: a[1,3] Out[30]: 8
对于数组a,只需要用a[m,n]选取各元素即可,其中m和n为元素的下标。
索引和切片
NumPy的索引和切片与Python非常类似。示例代码如下:
In[31]: a=arange(10) In[32]: a Out[32]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
用下标切片的示例代码如下:
In[33]: a[4:7] Out[33]: array([4, 5, 6])
若想以2为步长选取元素,可用如下命令:
In[35]: a[::2] Out[35]: array([0, 2, 4, 6, 8])
用负数下标翻转数组的示例代码如下:
In[36]: a[::-1] Out[36]: array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])