一、NumPy是什么?¶
量化分析的工作涉及到大量的数值运算,一个高效方便的科学计算工具是必不可少的。Python语言一开始并不是设计为科学计算使用的语言,随着越来越多的人发现Python的易用性,逐渐出现了关于Python的大量外部扩展,NumPy (Numeric Python)就是其中之一。NumPy提供了大量的数值编程工具,可以方便地处理向量、矩阵等运算,极大地便利了人们在科学计算方面的工作。另一方面,Python是免费,相比于花费高额的费用使用Matlab,NumPy的出现使Python得到了更多人的青睐。
我们可以简单看一下如何开始使用NumPy:
import numpy
numpy.version.full_version
我们使用了"import"命令导入了NumPy,并使用numpy.version.full_version查出了量化实验室里使用的NumPy版本为1.8.0。在往后的介绍中,我们将大量使用NumPy中的函数,每次都添加numpy在函数前作为前缀比较费劲,在之前的介绍中,我们提及了引入外部扩展模块时的小技巧,可以使用"from numpy import *"解决这一问题。
那么问题解决了?慢!Python的外部扩展成千上万,在使用中很可能会import好几个外部扩展模块,如果某个模块包含的属性和方法与另一个模块同名,就必须使用import module来避免名字的冲突。即所谓的名字空间(namespace)混淆了,所以这前缀最好还是带上。
那有没有简单的办法呢?有的,我们可以在import扩展模块时添加模块在程序中的别名,调用时就不必写成全名了,例如,我们使用"np"作为别名并调用version.full_version函数:
import numpy as np
np.version.full_version
二、初窥NumPy对象:数组¶
NumPy中的基本对象是同类型的多维数组(homogeneous multidimensional array),这和C++中的数组是一致的,例如字符型和数值型就不可共存于同一个数组中。先上例子:
a = np.arange(20)
这里我们生成了一个一维数组a,从0开始,步长为1,长度为20。Python中的计数是从0开始的,R和Matlab的使用者需要小心。可以使用print查看:
print a
我们可以通过"type"函数查看a的类型,这里显示a是一个array:
type(a)
通过函数"reshape",我们可以重新构造一下这个数组,例如,我们可以构造一个4*5的二维数组,其中"reshape"的参数表示各维度的大小,且按各维顺序排列(两维时就是按行排列,这和R中按列是不同的):
a = a.reshape(4, 5)
print a
构造更高维的也没问题:
a = a.reshape(2, 2, 5)
print a
既然a是array,我们还可以调用array的函数进一步查看a的相关属性:"ndim"查看维度;"shape"查看各维度的大小;"size"查看全部的元素个数,等于各维度大小的乘积;"dtype"可查看元素类型;"dsize"查看元素占位(bytes)大小。
a.ndim
a.shape
a.size
a.dtype
三、创建数组¶
数组的创建可通过转换列表实现,高维数组可通过转换嵌套列表实现:
raw = [0,1,2,3,4]
a = np.array(raw)
a
raw = [[0,1,2,3,4], [5,6,7,8,9]]
b = np.array(raw)
b
一些特殊的数组有特别定制的命令生成,如4*5的全零矩阵:
d = (4, 5)
np.zeros(d)
默认生成的类型是浮点型,可以通过指定类型改为整型:
d = (4, 5)
np.ones(d, dtype=int)
[0, 1)区间的随机数数组:
np.random.rand(5)
四、数组操作¶
简单的四则运算已经重载过了,全部的'+','-','*','/'运算都是基于全部的数组元素的,以加法为例:
a = np.array([[1.0, 2], [2, 4]])
print "a:"
print a
b = np.array([[3.2, 1.5], [2.5, 4]])
print "b:"
print b
print "a+b:"
print a+b
这里可以发现,a中虽然仅有一个与元素是浮点数,其余均为整数,在处理中Python会自动将整数转换为浮点数(因为数组是同质的),并且,两个二维数组相加要求各维度大小相同。当然,NumPy里这些运算符也可以对标量和数组操作,结果是数组的全部元素对应这个标量进行运算,还是一个数组:
print "3 * a:"
print 3 * a
print "b + 1.8:"
print b + 1.8
类似C++,'+='、'-='、'*='、'/='操作符在NumPy中同样支持:
a /= 2
print a
开根号求指数也很容易:
print "a:"
print a
print "np.exp(a):"
print np.exp(a)
print "np.sqrt(a):"
print np.sqrt(a)
print "np.square(a):"
print np.square(a)
print "np.power(a, 3):"
print np.power(a, 3)
需要知道二维数组的最大最小值怎么办?想计算全部元素的和、按行求和、按列求和怎么办?for循环吗?不,NumPy的ndarray类已经做好函数了:
a = np.arange(20).reshape(4,5)
print "a:"
print a
print "sum of all elements in a: " + str(a.sum())
print "maximum element in a: " + str(a.max())
print "minimum element in a: " + str(a.min())
print "maximum element in each row of a: " + str(a.max(axis=1))
print "minimum element in each column of a: " + str(a.min(axis=0))
科学计算中大量使用到矩阵运算,除了数组,NumPy同时提供了矩阵对象(matrix)。矩阵对象和数组的主要有两点差别:一是矩阵是二维的,而数组的可以是任意正整数维;二是矩阵的'*'操作符进行的是矩阵乘法,乘号左侧的矩阵列和乘号右侧的矩阵行要相等,而在数组中'*'操作符进行的是每一元素的对应相乘,乘号两侧的数组每一维大小需要一致。数组可以通过asmatrix或者mat转换为矩阵,或者直接生成也可以:
a = np.arange(20).reshape(4, 5)
a = np.asmatrix(a)
print type(a)
b = np.matrix('1.0 2.0; 3.0 4.0')
print type(b)
再来看一下矩阵的乘法,这使用arange生成另一个矩阵b,arange函数还可以通过arange(起始,终止,步长)的方式调用生成等差数列,注意含头不含尾。
b = np.arange(2, 45, 3).reshape(5, 3)
b = np.mat(b)
print b
有人要问了,arange指定的是步长,如果想指定生成的一维数组的长度怎么办?好办,"linspace"就可以做到:
np.linspace(0, 2, 9)
回到我们的问题,矩阵a和b做矩阵乘法:
print "matrix a:"
print a
print "matrix b:"
print b
c = a * b
print "matrix c:"
print c
五、数组元素访问¶
数组和矩阵元素的访问可通过下标进行,以下均以二维数组(或矩阵)为例:
a = np.array([[3.2, 1.5], [2.5, 4]])
print a[0][1]
print a[0, 1]
可以通过下标访问来修改数组元素的值:
b = a
a[0][1] = 2.0
print "a:"
print a
print "b:"
print b
现在问题来了,明明改的是a[0][1],怎么连b[0][1]也跟着变了?这个陷阱在Python编程中很容易碰上,其原因在于Python不是真正将a复制一份给b,而是将b指到了a对应数据的内存地址上。想要真正的复制一份a给b,可以使用copy:
a = np.array([[3.2, 1.5], [2.5, 4]])
b = a.copy()
a[0][1] = 2.0
print "a:"
print a
print "b:"
print b
若对a重新赋值,即将a指到其他地址上,b仍在原来的地址上:
a = np.array([[3.2, 1.5], [2.5, 4]])
b = a
a = np.array([[2, 1], [9, 3]])
print "a:"
print a
print "b:"
print b
利用':'可以访问到某一维的全部数据,例如取矩阵中的指定列:
a = np.arange(20).reshape(4, 5)
print "a:"
print a
print "the 2nd and 4th column of a:"
print a[:,[1,3]]
稍微复杂一些,我们尝试取出满足某些条件的元素,这在数据的处理中十分常见,通常用在单行单列上。下面这个例子是将第一列大于5的元素(10和15)对应的第三列元素(12和17)取出来:
a[:, 2][a[:, 0] > 5]
可使用where函数查找特定值在数组中的位置:
loc = numpy.where(a==11)
print loc
print a[loc[0][0], loc[1][0]]
六、数组操作¶
还是拿矩阵(或二维数组)作为例子,首先来看矩阵转置:
a = np.random.rand(2,4)
print "a:"
print a
a = np.transpose(a)
print "a is an array, by using transpose(a):"
print a
b = np.random.rand(2,4)
b = np.mat(b)
print "b:"
print b
print "b is a matrix, by using b.T:"
print b.T
矩阵求逆:
import numpy.linalg as nlg
a = np.random.rand(2,2)
a = np.mat(a)
print "a:"
print a
ia = nlg.inv(a)
print "inverse of a:"
print ia
print "a * inv(a)"
print a * ia
求特征值和特征向量
a = np.random.rand(3,3)
eig_value, eig_vector = nlg.eig(a)
print "eigen value:"
print eig_value
print "eigen vector:"
print eig_vector
按列拼接两个向量成一个矩阵:
a = np.array((1,2,3))
b = np.array((2,3,4))
print np.column_stack((a,b))
在循环处理某些数据得到结果后,将结果拼接成一个矩阵是十分有用的,可以通过vstack和hstack完成:
a = np.random.rand(2,2)
b = np.random.rand(2,2)
print "a:"
print a
print "b:"
print a
c = np.hstack([a,b])
d = np.vstack([a,b])
print "horizontal stacking a and b:"
print c
print "vertical stacking a and b:"
print d
七、缺失值¶
缺失值在分析中也是信息的一种,NumPy提供nan作为缺失值的记录,通过isnan判定。
a = np.random.rand(2,2)
a[0, 1] = np.nan
print np.isnan(a)
nan_to_num可用来将nan替换成0,在后面会介绍到的更高级的模块pandas时,我们将看到pandas提供能指定nan替换值的函数。
print np.nan_to_num(a)
NumPy还有很多的函数,想详细了解可参考链接http://wiki.scipy.org/Numpy_Example_List 和 http://docs.scipy.org/doc/numpy
最后献上NumPy SciPy Pandas Cheat Sheet
相关推荐
TA-Lib(Technical Analysis Library, 即技术分析库)是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标,如MACD、RSI、KDJ、动量指标、布林带等。但很多人安装指标计算ta-lib库就总...
Python量化技术分析是一种利用编程语言Python对金融市场数据进行科学计算和预测的方法,而TA-Lib(Technical Analysis Library)是其中一款广泛使用的库,专为技术分析提供了大量的预定义指标。本教程将详细介绍如何...
总的来说,Python金融分析基础库TA-Lib为金融专业人士和数据分析师提供了一套强大的工具集,帮助他们更深入地理解和预测金融市场。通过掌握TA-Lib,开发者可以构建出功能丰富的金融分析应用,提升投资决策的科学性和...
在这个项目中,我们将探讨如何使用Python的numpy库生成临时图像,然后利用OpenCV(cv2)库的imencode()函数来生成不同质量级别的JPEG文件,并从中提取量化表。这个过程对于理解JPEG压缩机制以及进行自定义压缩优化...
国内外主流量化投资网站大多支持Python语言,其在量化投资领域有一种逐渐淘汰其他语言,一统“江湖”之势。 对数据的分析离不开数据的可视化,相对于Python在数据分析、人工智能、量化投资等领域中的发展,在数据...
在IT行业中,Python是一种广泛应用的开发语言,尤其在数据处理、图像分析以及自动化任务中表现卓越。本项目“Python实现将大量图片按色块拟合拼接为指定的大图”聚焦于利用Python处理图像,通过将多张图片按特定色块...
在Python中,通常需要特定的库来与MLX90640进行通信,如` mlx90640-library `,它提供了读取和解析传感器数据的函数。开发者可以使用这个库来获取温度数据,然后进一步处理或可视化这些数据。 1. **数据读取**:...
TA-Lib 支持python3.12的whl文件”,这表明我们讨论的是一个用于Python编程的金融技术分析库TA-Lib,而且它有一个专为Python 3.12版本设计的预编译二进制包(whl文件)。在Python生态系统中,whl文件是一种预先构建...
3. **图像处理库**:在Python中,开发者可能使用了numpy进行数学运算,PIL或OpenCV处理图像,scipy进行DCT和量化操作,以及zlib或gzip进行熵编码和解码。 4. **算法优化**:优化可能包括: - 量化表的优化:调整...
7. **依赖包管理**: 项目包含了所有必要的依赖包文件,这可能是一个requirements.txt文件,列出了项目运行所需的Python库及其版本,例如numpy、pandas等。 8. **环境兼容性**: 注意到描述中提到“不太确定能否兼容...
Python数据分析在环境科学领域的应用越来越广泛,特别是在水体监测与评价中。本实例代码着重讲解如何利用Python进行基于水色图像的水质评价。水色图像通常包含丰富的信息,如水体颜色、浑浊度等,这些信息能反映出...
在Python中,实现这些功能通常会用到`PIL`(Python Imaging Library)或其更新版本`Pillow`,以及科学计算库`NumPy`。`OpenCV`也是一个强大的图像处理库,它提供了更多的高级功能,例如边缘检测、特征匹配等。 对于...
1. `zpd_talib.py`: 可能包含了与技术分析相关的函数,Talib(Technical Analysis Library)是一个广泛使用的金融技术分析库,可能被用来计算各种技术指标。 2. `cpuinfo.py`: 通常用于获取CPU信息,可能用于性能...
《使用Python进行计算机视觉编程》一书由Jan Erik Solem撰写,于2011年出版,该书全面深入地探讨了如何运用Python语言及相关的科学计算库来处理和分析图像,实现计算机视觉任务。以下是对书中各章节知识点的详细解析...
TA-Lib,全称为Technical Analysis Library,是一款广泛应用于金融领域,特别是量化交易中的技术分析库。这个库提供了大量的金融时间序列分析函数,包括常见的技术指标,如移动平均线(MA)、相对强弱指数(RSI)、...
6. **回测框架**:对于金融数据分析和量化交易,`alphapy`可能提供了回测功能,可以模拟历史数据来测试策略的可行性,帮助开发者评估模型的长期表现。 7. **文档与社区支持**:成熟的库通常会有详尽的文档和活跃的...
在Python编程领域,图片处理是一项常见的任务,而`paintingReorganize`项目则提供了一个独特的方法,通过主成分分析(PCA)来重新组织像素,将原始的像素画转化为更光滑、更简洁的调色板效果。PCA是一种统计学方法,...
在本项目中,我们关注的是一个基于Python的图像检索系统,该系统涵盖了图像处理和计算机视觉领域的关键步骤。首先,让我们深入理解这个系统的各个组成部分及其相关的技术知识点。 1. **特征提取**:图像检索的核心...
《Pandas-TA-Quant 0.2.6:数据科学与量化交易的高效工具》 在数据分析和金融交易领域,Python的Pandas库已经成为了不...无论你是专业的数据分析师还是业余交易爱好者,这个库都能极大地提升你的工作效率和分析深度。