导读:Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,其提供了矩阵运算的功能。本文带你了解Numpy的一些核心知识点。

作者:魏溪含 涂铭 张修鹏
如需转载请联系大数据(ID:hzdashuju)

Numpy提供的主要功能具体如下:

  • ndarray——一个具有向量算术运算和复杂广播能力的多维数组对象。

  • 用于对数组数据进行快速运算的标准数学函数。

  • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。

  • 非常有用的线性代数,傅里叶变换和随机数操作。

  • 用于集成C /C++和Fortran代码的工具。

除了明显的科学计算用途之外,Numpy还可以用作通用数据的高效多维容器,定义任意的数据类型。这些都使得Numpy能够无缝、快速地与各种数据库集成。

提示:这里提到的“广播”可以这么理解:当两个维度不同的数组(array)运算的时候,可以将低维的数组复制成高维数组参与运算(因为Numpy运算的时候需要结构相同)。

在学习图像识别的过程中,需要将图片转换为矩阵。即将对图片的处理简化为向量空间中的向量运算。基于向量运算,我们就可以实现图像的识别。

01 创建数组

现在就来关注下Numpy中的一些核心知识点。在Numpy中,最核心的数据结构是ndarray, ndarray代表的是多维数组,数组指的是数据的集合。为了方便理解,我们下面列举一个小例子。

一个班级里学生的学号可以通过一维数组来表示,数组名为a,数组a中存储的是数值类型的数据,分别是1,2,3,4。

索引

学号

0

1

1

2

2

3

3

4

其中,a[0]代表的是第一个学生的学号1,a[1]代表的是第二个学生的学号2,以此类推。

一个班级里学生的学号和姓名,可以用二维数组来表示,数组名为b。

1

Tim

2

Joey

3

Johnny

4

Frank

类似的,其中b[0,0]代表的就是1(学号),b[0,1]代表的就是Tim(学号为1的学生的名字),以此类推b[1,0]代表的是2(学号)等。

借用线性代数的说法,一维数组通常称为向量(vector),二维数组通常称为矩阵(matrix)。

当我们安装完Anaconda之后,默认情况下Numpy已经在库中了,所以不需要额外安装。下面我们来写一些语句简单测试下Numpy库。

1)在Anaconda的Notebook里输入

import numpy as np

之后,通过键盘按住Shift+Enter执行,如果没有报错,则说明Numpy已被正常引入,如图2-7所示。

▲图2-7 在Notebook中引入Numpy

稍微解释下这条语句:通过import关键字将Numpy库引入,然后通过as为其取一个别名np,别名的作用是为了便于后续引用。

2)Numpy中的array()可以直接导入向量,代码如下:

vector = np.array([1,2,3,4])

3)numpy.array()方法也可以导入矩阵,代码如下:

matrix = np.array([[1,'Tim'],[2,'Joey'],[3,'Johnny'],[4,'Frank']])

02 创建Numpy数组

我们可以通过创建Python列表(list)的方式来创建Numpy矩阵,比如输入

nparray = np.array([i for i in range(10)])

可以看到返回的结果是

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

同样,也可以通过Python列表的方式来修改值,比如输入

nparray[0] = 10

再来观察nparray的向量内容就会发现返回的结果是

array([ 10, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Numpy数组还封装了其他方法来创建矩阵。首先,我们介绍第一个方法np.zeros(从命名规则来看,这个方法就是用来创建数值都为0的向量),比如,我们输入:

a = np.zeros(10)

可以看到结果为:

array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

从上述结果可以看出,每一个0后面都有一个小数点,调用a.dtype会发现我们创建的这个向量的类型为dtype(‘float64’)。值得注意的是:在大部分图像识别算法开发中,我们使用的都是float64这个类型。如果希望在创建Numpy矩阵的时候强制规定一种类型,那么我们可以使用以下代码:

np.zeros(10,dtype=int)

这样,返回的结果在矩阵中的数据就都是整型0了。介绍完使用zeros方法创建向量之后,再来看看如何创建一个多维矩阵。我们可以使用传入元组的方式,代码如下:

np.zeros(shape=(3,4)) #代表创建的是三行四列的矩阵并且其数据类型为float64

返回的结果为:

array([[ 0.,  0.,  0.,  0.],[ 0.,  0.,  0.,  0.],[ 0.,  0.,  0.,  0.]])

与np.zeros方法相似的还有np.ones方法,顾名思义,np.ones方法创建的矩阵的数值都为1。我们来举个例子:

np.ones((3,4))

返回的结果如下:

array([[ 1.,  1.,  1.,  1.],[ 1.,  1.,  1.,  1.],[ 1.,  1.,  1.,  1.]])

读者可能会比较好奇,既然我们可以创建数值全为0的矩阵,也可以创建数值全为1的矩阵,那么Numpy是否提供了一个方法可以让我们自己指定值呢?答案是肯定的,这个方法就是np.full方法,我们来看一个例子,代码如下:

np.full((3,5),121) #这个方法的意思是我们创建了一个三行五列的矩阵,默认值为121

返回的结果是:

array([[121, 121, 121, 121, 121],[121, 121, 121, 121, 121],[121, 121, 121, 121, 121]])

我们也可以使用np.arange方法来创建Numpy的矩阵。示例代码如下:

np.arange(0,20,2) #arange接收三个参数,与Python中的range方法相似,arange也是前闭后开的方法,第一个参数为向量的第一个值0,第二个参数为最后一个值20,因为是后开所以取的是18,第三个参数为步长,默认为1,本例中设置为2,所以最后一个值是18。

返回的结果是:

array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

我们可以使用np.linspace方法(前闭后闭)来对Numpy矩阵进行等分,比如将0~10等分为5份的代码如下:

np.linspace(0,10,5)

返回的结果是:

array([  0. ,   2.5,   5. ,   7.5,  10. ])

下面通过几个例子再来看看在Numpy矩阵中如何生成随机数矩阵。

1)生成一个长度为10的向量,里面每一个数值都是介于0~10之间的整数,代码如下:

import numpy as np
np.random.randint(0,10,10)

2)如果不确定每个参数代表的意思,则加上参数名size,代码如下:

np.random.randint(0,5,size=5)  #注意是前闭后开,永远取不到5

3)我们也可以生成一个三行五列的整数矩阵,代码如下

np.random.randint(4,9,size=(3,5))

4)seed的作用:如果不希望每次生成的随机数都不固定,那么我们可以使用np.random.seed(1),随机种子使用数字1记录,这以后只要是用随机种子1生成的随机数就都是固定的。

5)我们也可以生成介于0~1之间的浮点数的向量或者矩阵,代码如下:

np.random.random(10)        #生成0~1之间的浮点数,向量的长度为10
np.random.random((2,4))        #生成0~1之间的浮点数,二行四列的矩阵

6)np.random.normal()表示的是一个正态分布,normal在这里是正态的意思。numpy.random.normal(loc=0,scale=1,size=shape)的意义如下:

  • 参数loc(float):正态分布的均值,对应这个分布的中心。loc=0说明这是一个以Y轴为对称轴的正态分布。

  • 参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。

  • 参数size(int或者整数元组):输出的值赋在shape里,默认为None。

03 获取Numpy属性

首先,我们通过Numpy中的一个方法arange(n),生成0到n-1的数组。比如,我们输入

np.arange(15)

可以看到返回的结果是

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

然后,再通过Numpy中的reshape(row,column)方法,自动构架一个多行多列的array对象。

比如,我们输入:

a = np.arange(15).reshape(3,5)        #代表3行5列

可以看到结果:

array([[ 0,  1,  2,  3,  4],[ 5,  6,  7,  8,  9],[10, 11, 12, 13, 14]])

有了基本数据之后,我们就可以通过Numpy提供的shape属性获取Numpy数组的行数与列数,示例代码如下:

print(a.shape)

可以看到返回的结果是一个元组(tuple),第一个3代表的是3行,第二个5代表的是5列:

(3, 5)

我们可以通过.ndim来获取Numpy数组的维度,示例代码如下:

importnumpy as np
x = np.arange(15)
print(x.ndim)        #输出x向量的维度,这时能看到的维度是1维
X = x.reshape(3,5)    #将x向量转为三行五列的二维矩阵
Print(X.ndim)        #输出X矩阵的维度,这时能看到的维度是2维
reshape方法的特别用法
如果只关心需要多少行或者多少列,其他由计算机自己来算,那么这个时候我们可以使用如下方法:
x.reshape(15,-1)    #我关心的是我只要15行,列由计算机自己来算
x.reshape(-1,15)    #我关心的是我只要15列,行由计算机自己来算

04 Numpy数组索引

Numpy支持类似list的定位操作,示例代码如下:

import numpy as np
matrix = np.array([[1,2,3],[20,30,40]])
print(matrix[0,1])

得到的结果是2。

上述代码中的matrix[0,1],0代表的是行,在Numpy中,0代表起始的第一个,所以取的是第1行,之后的1代表的是列,所以取的是第2列。那么,最后的输出结果是取第一行第二列,也就是2这个值了。

05 切片

Numpy支持类似list的切片操作,示例代码如下:

import numpy as np
matrix = np.array([
[5, 10, 15], [20, 25, 30],[35, 40, 45]])
print(matrix[:,1])
print(matrix[:,0:2])
print(matrix[1:3,:])
print(matrix[1:3,0:2])

上述的代码中

  • print(matrix[:,1])语法代表选择所有的行,而且列的索引是1的数据,因此返回的结果是10,25,40。

  • print(matrix[:,0:2])代表的是选取所有的行,而且列的索引是0和1的数据。

  • print(matrix[1:3,:])代表的是选取所有的列,而且行的索引值是1和2的数据。

  • print(matrix[1:3,0:2])代表的是选取行的索引是1和2,而且列的索引是0和1的所有数据。

06 Numpy中的矩阵运算

矩阵运算(加、减、乘、除),在本书中将严格按照数学公式来进行演示,即两个矩阵的基本运算必须具有相同的行数与列数。本例只演示两个矩阵相减的操作,其他的操作读者可以自行测试。示例代码如下:

import numpy as np
myones = np.ones([3,3])
myeye = np.eye(3)        #生成一个对角线的值为1,其余值都为0的三行三列矩阵
print(myeye)
print(myones-myeye)

输出结果如下:

[[ 1.  0.  0.]
[ 0.  1.  0.]
[ 0.  0.  1.]]
[[ 0.  1.  1.]
[ 1.  0.  1.]
[ 1.  1.  0.]]

提示:numpy.eye(N, M=None, k=0, dtype=<type 'float'>)中第一个参数输出矩阵(行数=列数),第三个参数默认情况下输出的是对角线的值全为1,其余值全为0。

除此之外,Numpy还预置了很多函数,使用这些函数可以作用于矩阵中的每个元素。

Numpy预置函数及说明:

  • np.sin(a):对矩阵a中的每个元素取正弦,sin(x)

  • np.cos(a):对矩阵a中的每个元素取余弦,cos(x)

  • np.tan(a):对矩阵a中的每个元素取正切,tan(x)

  • np.sqrt(a):对矩阵a中的每个元素开根号

  • np.abs(a):对矩阵a中的每个元素取绝对值

1. 矩阵之间的点乘

矩阵真正的乘法必须满足第一个矩阵的列数等于第二个矩阵的行数,矩阵乘法的函数为dot。示例代码如下:

import numpy as np
mymatrix = np.array([[1,2,3],[4,5,6]])
a = np.array([[1,2],[3,4],[5,6]])
print(mymatrix.shape[1] == a.shape[0])
print(mymatrix.dot(a))

其输出结果如下:

[[22 28][49 64]]

上述示例代码的原理是将mymatrix的第一行[1,2,3]与a矩阵的第一列[1,3,5]相乘然后相加,接着将mymatrix的第一行[1,2,3]与a矩阵的第二列[2,4,6]相乘然后相加,以此类推。

2. 矩阵的转置

矩阵的转置是指将原来矩阵中的行变为列。示例代码如下:

import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.T)

输出结果如下:

[[1 4][2 5][3 6]]

3. 矩阵的逆

需要首先导入numpy.linalg,再用linalg的inv函数来求逆,矩阵求逆的条件是矩阵的行数和列数必须是相同的。示例代码如下:

import numpy as np
import numpy.linalg as lg
A = np.array([[0,1],[2,3]])
invA = lg.inv(A)
print(invA)
print(A.dot(invA))

输出结果如下:

[[-1.5  0.5]
[ 1.   0. ]]

逆矩阵就是,原矩阵A.dot(invA)以及逆矩阵invA.dot(A)的结果都为单位矩阵。并不是所有的矩阵都有逆矩阵。

07 数据类型转换

Numpy ndarray数据类型可以通过参数dtype进行设定,而且还可以使用参数astype来转换类型,在处理文件时该参数会很实用。注意,astype调用会返回一个新的数组,也就是原始数据的备份。

比如,将String转换成float。示例代码如下:

vector = numpy.array(["1", "2", "3"])
vector = vector.astype(float)

注意:在上述例子中,如果字符串中包含非数字类型,那么从string转换成float就会报错。

关于作者:魏溪含 ,爱丁堡大学人工智能硕士,阿里巴巴达摩院算法专家,在计算机视觉、大数据领域有8年以上的算法架构和研发经验。
涂铭,阿里巴巴数据架构师,对大数据、自然语言处理、图像识别、Python、Java相关技术有深入的研究,积累了丰富的实践经验。
张修鹏,毕业于中南大学,阿里巴巴技术发展专家,长期从事云计算、大数据、人工智能与物联网技术的商业化应用,在阿里巴巴首次将图像识别技术引入工业,并推动图像识别产品化、平台化。
本文摘编自《深度学习与图像识别:原理与实践》,经出版方授权发布。
延伸阅读《深度学习与图像识别:原理与实践》
点击上图了解及购买
转载请联系微信:DoctorData

推荐语:阿里巴巴达摩院算法专家、阿里巴巴技术发展专家、阿里巴巴数据架构师联合撰写,从技术原理、算法和工程实践3个维度系统展开,既适合零基础读者快速入门,又适合有基础读者理解其核心技术;写作方式上避开了艰涩的数学公式及其推导,深入浅出。

「大数据」内容合伙人之「鉴书小分队」上线啦!

最近,你都在读什么书?有哪些心得体会想要跟大家分享?

数据叔最近搞了个大事——联合优质图书出版商机械工业出版社华章公司发起鉴书活动。

简单说就是:你可以免费读新书,你可以免费读新书的同时,顺手码一篇读书笔记就行。详情请在大数据公众号后台对话框回复合伙人查看。

有话要说?

Q: 你用NumPy实现哪些功能?

欢迎留言与大家分享

猜你想看?
  • 数据分析与数据化运营的关键知识点,全在这里了

  • 如何在 Apache Flink 中使用 Python API?

  • 解读人工智能、大数据和云计算的关系,大佬们赌AI竟都输了?

  • 身高2m,体重2kg,这样的数据“看上去很好”?

更多精彩?

在公众号对话框输入以下关键词

查看更多优质内容!

PPT | 报告 | 读书 | 书单 | 干货 

大数据 | 揭秘 | Python | 可视化

AI | 人工智能 | 5G | 区块链

机器学习 | 深度学习 | 神经网络

合伙人 1024 | 段子 | 数学 | 高考

据统计,99%的大咖都完成了这个神操作

?

觉得不错,请把这篇文章分享给你的朋友

转载 / 投稿请联系:baiyu@hzbook.com

更多精彩,请在后台点击“历史文章”查看

点击阅读原文,了解更多

玩数据必备Python库:Numpy使用详解相关推荐

  1. Python库的安装详解

    安装非标准Python库 Python标准库中,用于网页数据采集的有urllib库,同样,有很多优秀的开源库,像BeautifulSoup库.Requests库等.  接下来就介绍一些开源库的安装方法 ...

  2. python中math函数库矩阵_Python中矩阵库Numpy基本操作详解

    NumPy是一个关于矩阵运算的库,熟悉Matlab的都应该清楚,这个库就是让python能够进行矩阵话的操作,而不用去写循环操作. 下面对numpy中的操作进行总结. numpy包含两种基本的数据类型 ...

  3. 常量数组 python_python数据科学系列:numpy入门详解教程

    python数据科学基础库主要是三剑客:numpy,pandas以及matplotlib,每个库都集成了大量的方法接口,配合使用功能强大.平时虽然一直在用,也看过很多教程,但纸上得来终觉浅,还是需要自 ...

  4. 【机器学习必备知识】NumPy线性代数详解

    NumPy 线性代数 前言 numpy.dot() numpy.vdot() numpy.inner() numpy.matmul numpy.linalg.det() numpy.linalg.so ...

  5. python安装requests库超时_【Python 库】requests 详解超时和重试

    网络请求不可避免会遇上请求超时的情况,在 requests 中,如果不设置你的程序可能会永远失去响应. 超时又可分为连接超时和读取超时. 连接超时 连接超时指的是在你的客户端实现到远端机器端口的连接时 ...

  6. python参数估计_python简单实现最大似然估计scipy库的使用详解

    python简单实现最大似然估计 1.scipy库的安装 wim+R输入cmd,然后cd到python的pip路径,即安装:pip install scipy即可 2.导入scipy库 from sc ...

  7. python的reshape方法_numpy库reshape用法详解

    numpy.reshape(重塑) 给数组一个新的形状而不改变其数据 numpy.reshape(a, newshape, order='C')参数: a:array_like 要重新形成的数组. n ...

  8. 入门机器学习的必备Python库

    点击关注我哦 一篇文章带你了解入门机器学习的必备Python库 1. Pandas Pandas模块是python一个开源库,包含DataFrame和Series两种数据结构用于组织数据极为有用.Pa ...

  9. python翻译库_[译] 鲜为人知的数据科学 Python 库

    Python 是一个很棒的语言.它是世界上发展最快的编程语言之一.它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性.整个 Python 及其库的生态系统使它成为全世界用户(初学者和 ...

最新文章

  1. 物联网成网络安全防护新重点!
  2. C++,那些可爱的小陷阱(一)
  3. 脑电分析系列[MNE-Python-12]| 注释连续数据
  4. 8.3. 测试 opensips
  5. 攻防世界-web-bug-从0到1的解题历程writeup
  6. 多重 for 循环,如何提高效率?
  7. c++第n小的质数_形形色色的素数 -- 质数定理
  8. HDU - 2018 母牛的故事
  9. c++ 文件读写(转)
  10. 如何构建你的聊天界面
  11. qq发文件大小上限_微信再两个放大招!网友:QQ可以卸载了?
  12. 梯度下降法理论与实践
  13. vue使用echarts地图数据分析
  14. 计算机算法基础总结(借鉴、整理)
  15. VS2010 正式版 破解方法详解
  16. java中的build类_30 Java设计模式系列-建造者(Build)模式
  17. 计算机核心期刊(北大核心)投稿意见
  18. linux 嵌入式 快照_Linux下搭建Cortex-M嵌入式开发环境
  19. IDEA中怎么创建xml文件
  20. 我们所看到的迎宾机器人,真的好用吗?

热门文章

  1. Arduino笔记-使用独立电源给Arduino供电并闪灯
  2. 前端笔记-vue cli中v-bind动态数据实时更新
  3. Wireshark工作笔记-对TCP连接与断开以及数据传输的实战分析
  4. Java基础入门笔记-添加包
  5. flexigrid参数API
  6. mysql date compare_SQLDataCompare下载
  7. 收银系统服务器有什么好处,生鲜超市收银系统软件怎么选?收银系统能带来什么好处?...
  8. mac docker安装linux,Mac上使用docker安装centos
  9. 语法和c区别_史冠新 | 汉语语法单位辨正
  10. mysql为什么每天0点就装东西_MySQL 的 MRR 到底是什么?