Python量化投资:技术、模型与策略
上QQ阅读APP看书,第一时间看更新

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])