python学习笔记第三天:python之numpy篇!

此图只是为了封面而已,并非python女友

接下来要给大家介绍的系列中包含了Python在量化金融中运用最广泛的几个Library:

numpy

scipy

pandas

matplotlib

###NumPy 简介

一、NumPy是什么?

量化分析的工作涉及到大量的数值运算,一个高效方便的科学计算工具是必不可少的。Python语言一开始并不是设计为科学计算使用的语言,随着越来越多的人发现Python的易用性,逐渐出现了关于Python的大量外部扩展,NumPy (Numeric Python)就是其中之一。NumPy提供了大量的数值编程工具,可以方便地处理向量、矩阵等运算,极大地便利了人们在科学计算方面的工作。另一方面,Python是免费,相比于花费高额的费用使用Matlab,NumPy的出现使Python得到了更多人的青睐。

我们可以简单看一下如何开始使用NumPy:

那么问题解决了?慢!Python的外部扩展成千上万,在使用中很可能会import好几个外部扩展模块,如果某个模块包含的属性和方法与另一个模块同名,就必须使用import module来避免名字的冲突。即所谓的名字空间(namespace)混淆了,所以这前缀最好还是带上。

那有没有简单的办法呢?有的,我们可以在import扩展模块时添加模块在程序中的别名,调用时就不必写成全名了,例如,我们使用"np"作为别名并调用version.full_version函数:

二、初窥NumPy对象:数组

NumPy中的基本对象是同类型的多维数组(homogeneous multidimensional array),这和C++中的数组是一致的,例如字符型和数值型就不可共存于同一个数组中。先上例子:

这里我们生成了一个一维数组a,从0开始,步长为1,长度为20。Python中的计数是从0开始的,R和Matlab的使用者需要小心。可以使用print查看:

我们可以通过"type"函数查看a的类型,这里显示a是一个array:

通过函数"reshape",我们可以重新构造一下这个数组,例如,我们可以构造一个4*5的二维数组,其中"reshape"的参数表示各维度的大小,且按各维顺序排列(两维时就是按行排列,这和R中按列是不同的):

构造更高维的也没问题:

既然a是array,我们还可以调用array的函数进一步查看a的相关属性:"ndim"查看维度;"shape"查看各维度的大小;"size"查看全部的元素个数,等于各维度大小的乘积;"dtype"可查看元素类型;"dsize"查看元素占位(bytes)大小。

三、创建数组

数组的创建可通过转换列表实现,高维数组可通过转换嵌套列表实现:

一些特殊的数组有特别定制的命令生成,如4*5的全零矩阵:

默认生成的类型是浮点型,可以通过指定类型改为整型:

[0, 1)区间的随机数数组:

四、数组操作

简单的四则运算已经重载过了,全部的'+','-','*','/'运算都是基于全部的数组元素的,以加法为例:

这里可以发现,a中虽然仅有一个与元素是浮点数,其余均为整数,在处理中Python会自动将整数转换为浮点数(因为数组是同质的),并且,两个二维数组相加要求各维度大小相同。当然,NumPy里这些运算符也可以对标量和数组操作,结果是数组的全部元素对应这个标量进行运算,还是一个数组:

类似C++,'+='、'-='、'*='、'/='操作符在NumPy中同样支持:

开根号求指数也很容易:

需要知道二维数组的最大最小值怎么办?想计算全部元素的和、按行求最大、按列求最大怎么办?for循环吗?不,NumPy的ndarray类已经做好函数了:

算中大量使用到矩阵运算,除了数组,NumPy同时提供了矩阵对象(matrix)。矩阵对象和数组的主要有两点差别:一是矩阵是二维的,而数组的可以是任意正整数维;二是矩阵的'*'操作符进行的是矩阵乘法,乘号左侧的矩阵列和乘号右侧的矩阵行要相等,而在数组中'*'操作符进行的是每一元素的对应相乘,乘号两侧的数组每一维大小需要一致。数组可以通过asmatrix或者mat转换为矩阵,或者直接生成也可以:

再来看一下矩阵的乘法,这使用arange生成另一个矩阵b,arange函数还可以通过arange(起始,终止,步长)的方式调用生成等差数列,注意含头不含尾。

有人要问了,arange指定的是步长,如果想指定生成的一维数组的长度怎么办?好办,"linspace"就可以做到:

回到我们的问题,矩阵a和b做矩阵乘法:

五、数组元素访问

数组和矩阵元素的访问可通过下标进行,以下均以二维数组(或矩阵)为例:

可以通过下标访问来修改数组元素的值:

现在问题来了,明明改的是a[0][1],怎么连b[0][1]也跟着变了?这个陷阱在Python编程中很容易碰上,其原因在于Python不是真正将a复制一份给b,而是将b指到了a对应数据的内存地址上。想要真正的复制一份a给b,可以使用copy:

若对a重新赋值,即将a指到其他地址上,b仍在原来的地址上:

利用':'可以访问到某一维的全部数据,例如取矩阵中的指定列:

稍微复杂一些,我们尝试取出满足某些条件的元素,这在数据的处理中十分常见,通常用在单行单列上。下面这个例子是将第一列大于5的元素(10和15)对应的第三列元素(12和17)取出来:

可使用where函数查找特定值在数组中的位置:

六、数组操作

还是拿矩阵(或二维数组)作为例子,首先来看矩阵转置:

矩阵求逆:

求特征值和特征向量:

按列拼接两个向量成一个矩阵:

在循环处理某些数据得到结果后,将结果拼接成一个矩阵是十分有用的,可以通过vstack和hstack完成:

一个水平合一起,一个垂直合一起

七、缺失值

缺失值在分析中也是信息的一种,NumPy提供nan作为缺失值的记录,通过isnan判定。

nan_to_num可用来将nan替换成0,在后面会介绍到的更高级的模块pandas时,我们将看到pandas提供能指定nan替换值的函数。

NumPy还有很多的函数,想详细了解可参考链接http://wiki.scipy.org/Numpy_Example_List 和 http://docs.scipy.org/doc/numpy

关注一下,不迷路!

本文来自企鹅号 - 家是温柔的港湾媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mathor

2017百度之星初赛(A):小C的倍数问题

 假设P进制下有个数(abc)~P~,若这个数满足:(abc)~P~ % B == 0,则以下两个等式一定成立:

723
来自专栏WD学习记录

牛客网 和为S的两个数字

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

1434
来自专栏ml

二分查找算法基本思想

转载http://www.cppblog.com/converse/archive/2009/10/05/97905.html 二分查找算法基本思想 二分查找算...

44211
来自专栏desperate633

LintCode 数字三角形题目分析1 (常规的动态规划解法)分析2 (如果你只用额外空间复杂度O(n)的条件)

给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。 ** 注意事项 如果你只用额外空间复杂度O(n)的条件下完成可以获...

772
来自专栏Python爬虫与数据挖掘

浅谈网络爬虫中广度优先算法和代码实现

前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章——浅谈网络爬虫中深度优先算法和简单代码实现。今天小编给大家...

1175
来自专栏数据结构与算法

洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)

题目描述 设d(x)为x的约数个数,给定N、M,求 \sum^N_{i=1}\sum^M_{j=1}d(ij)∑i=1N​∑j=1M​d(ij) 输入输出格式 ...

2644
来自专栏和蔼的张星的图像处理专栏

3. 统计数字暴力破解找规律

计算数字k在0到n中的出现的次数,k可能是0~9的一个值 样例: 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1...

1923
来自专栏King_3的技术专栏

leetcode-79-单词搜索(用dfs解决)

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

2161
来自专栏King_3的技术专栏

leetcode-492-Construct the Rectangle

1985
来自专栏小樱的经验随笔

Gym 100952J&&2015 HIAST Collegiate Programming Contest J. Polygons Intersection【计算几何求解两个凸多边形的相交面积板子题

J. Polygons Intersection time limit per test:2 seconds memory limit per test:64 ...

2707

扫码关注云+社区