博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Python数据科学指南》——2.2 使用NumPy库
阅读量:5930 次
发布时间:2019-06-19

本文共 5832 字,大约阅读时间需要 19 分钟。

本节书摘来自异步社区《Python数据科学指南》一书中的第2章,第2.2节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 使用NumPy库

Python中,NumPy提供了一条高效处理超大数组的途径。大多数Python科学计算库中都在内部使用NumPy处理数组和矩阵操作。在本书中,NumPy被广泛应用,我们在本节介绍它。

2.2.1 准备工作

我们先写一系列语句来操作数组和矩阵,学习如何使用NumPy。目的是让您习惯使用NumPy数组,它也是本书大多数内容的基础。

2.2.2 操作方法

我们先创建一些简单的矩阵和数组。

# Recipe_1a.py# 导入NumPy库,命名为npimport numpy as np# 创建数组a_list = [1,2,3]an_array = np.array(a_list)# 指定数据类型an_array = np.array(a_list,dtype=float)# 创建矩阵a_listoflist = [[1,2,3],[5,6,7],[8,9,10]]a_matrix = np.matrix(a_listoflist,dtype=float)

现在我们可以写一个简单方便的函数来处理NumPy对象。

# Recipe_1b.py# 一个用来检测给定的NumPy对象的小函数def display_shape(a):     print     print a     print     print "Nuber of elements in a = %d"%(a.size)     print "Number of dimensions in a = %d"%(a.ndim)     print "Rows and Columns in a ",a.shape     printdisplay_shape(a_matrix)

换种方式来创建数组。

# Recipe_1c.py# 换一种方式创建数组# 1. 使用np.arange来创建NumPy数组created_array = np.arange(1,10,dtype=float)display_shape(created_array)# 2. 使用np.linspace来创建NumPy数组created_array = np.linspace(1,10)display_shape(created_array)# 3. 使用np.logspace来创建NumPy数组created_array = np.logspace(1,10,base=10.0)display_shape(created_array) # 4.在创建数组时指定arange的步长,这是它与np.linspace不同的地方created_array = np.arange(1,10,2,dtype=int)display_shape(created_array)

现在我们来看如何创建一些特殊的矩阵。

# Recipe_1d.py# 创建一个所有元素都为1的矩阵ones_matrix = np.ones((3,3))display_shape(ones_matrix)#创建一个所有元素都为0的矩阵zeros_matrix = np.zeros((3,3))display_shape(zeros_matrix)# 鉴别矩阵# k参数控制1的索引# if k =0, (0,0),(1,1,),(2,2) cell values# 被设置为1,在一个3×3的矩阵中identity_matrix = np.eye(N=3,M=3,k=0)display_shape(identity_matrix)identity_matrix = np.eye(N=3,k=1)display_shape(identity_matrix)

了解了创建数组和矩阵的知识,我们再看一些整形操作。

# Recipe_1e.py# 数组的整形a_matrix = np.arange(9).reshape(3,3)display_shape(a_matrix)...display_shape(back_array)

接着来看一些矩阵的操作。

# Recipe_1f.py# 矩阵的操作a_matrix = np.arange(9).reshape(3,3)b_matrix = np.arange(9).reshape(3,3)...print "f_matrix, row sum",f_matrix.sum(axis=1)

最后,我们来看一些转置、复制和网格操作。

#Recipe_1g.py# 转置元素display_shape(f_matrix[::-1])...zz = zz.flatten()

我们再看看NumPy库里的一些随机数生成例程。

#Recipe_1h.py# 随机数general_random_numbers = np.random.randint(1,100, size=10)print general_random_numbers...uniform_rnd_numbers = np.random.normal(loc=0.2,scale=0.2,size=(3,3))

2.2.3 工作原理

我们先从导入NumPy库开始。

# 导入NumPy库,命名为npimport numpy as np

来看看用NumPy生成数组的多种方式。

# 数组a_list = [1,2,3]an_array = np.array(a_list)# 指定数据类型an_array = np.array(a_list,dtype=float)

一个数组可以基于列表创建,在前面的示例中,我们声明了一个具有3个元素的列表,然后用np.array()将这个列表转为了NumPy一维数组。如上面代码的最后一行所示,我们也可以指定数据的类型。

了解完数组,再来看看矩阵。

# 矩阵a_listoflist = [[1,2,3],[5,6,7],[8,9,10]]a_matrix = np.matrix(a_listoflist,dtype=float)

我们从listoflist里创建了一个矩阵,同样地,我们指定了数据的类型。

在继续之前,我们得先定义display_shape函数,这个函数我们接下来会经常用到。

def display_shape(a):     print     print a     print     print "Nuber of elements in a = %d"%(a.size)     print "Number of dimensions in a = %d"%(a.ndim)     print "Rows and Columns in a ",a.shape     print

所有的NumPy对象都有以下3个属性。

size:给定的NumPy对象里的元素个数。

ndim:维数。

shape:返回一个包含了NumPy对象各个维的长度的元组。

除了打印输出原始的元素,这个函数打印输出上述的3个属性,我们调用这个函数来处理我们之前创建的矩阵。

display_shape(a_matrix)

如图2-1所示,这个矩阵有9个元素,两个维度,最后,我们还能在shape参数里看到维数和每一维的元素个数。在本例中,矩阵有3行3列。

b07cfa0e3ee1bcb6b1e38c788eab1fb93d3a1de0

再看另一种创建数组的方法。

created_array = np.arange(1,10,dtype=float)display_shape(created_array)

NumPy的arange函数返回指定间隔的均匀隔开的数值,本例中,我们所需的是从1到10均匀分布的数值。访问以下URL可以获取更多关于arange的资料。

# 创建数组的另一种替代办法created_array = np.linspace(1,10)display_shape(created_array)

NumPy的linspace和arange类似,差别在于我们需要给出样例的数量值。使用linspace,我们知道在给定的范围里有多少个元素。默认情况下,它返回50个元素。而使用arange,我们还要指定步长。

created_array = np.logspace(1,10,base=10.0)display_shape(created_array)

NumPy给你提供了一些创建特殊数组的函数。

ones_matrix = np.ones((3,3))display_shape(ones_matrix)# 创建一个所有元素均为0的矩阵zeros_matrix = np.zeros((3,3))display_shape(zeros_matrix)

ones()和zero()函数分别用来创建全由1和0填充的矩阵,如图2-2所示。

单位矩阵的创建方式如下:

identity_matrix = np.eye(N=3,M=3,k=0)display_shape(identity_matrix)

be9183df71de8c68835b3feeddbde1a664444938

参数k控制了1的起始索引值,输出结果如图2-3所示。

identity_matrix = np.eye(N=3,k=1)display_shape(identity_matrix)

86d08bb39655c42d81abbcc75cc07da22dafabb0

reshape函数可以控制数组的形态。

# 数组转换形态a_matrix = np.arange(9).reshape(3,3)display_shape(a_matrix)

通过传递参数−1,我们可以将数组转化为我们所需要的维数,输入结果如图2-4所示。

# 参数-1可以将矩阵转为所需的维数back_to_array = a_matrix.reshape(-1)display_shape(back_to_array)

f026c69a43d018bb65f9c46e405d38697cf1a9a6

ravel和flatten函数可以用来将矩阵转化为一维的数组,如图2-5所示。

7203547639adf4a0c9e054085b4ffba669597273

3ca5a402e59e80e01af1755c8ee652d85f532d38

我们再看一些矩阵操作,如两矩阵相加。

c_matrix = a_matrix + b_matrix

再看看矩阵对应元素相乘。

d_matrix = a_matrix * b_matrix

下面是矩阵的乘法操作。

e_matrix = np.dot(a_matrix,b_matrix)

最后,是矩阵的转置。

f_matrix = e_matrix.T

min和max函数可以用来找出矩阵中最小和最大的元素,sum函数则用来对矩阵的行或列进行求和,如图2-6所示。

printprint "f_matrix,minimum = %d"%(f_matrix.min())print "f_matrix,maximum = %d"%(f_matrix.max())print "f_matrix, col sum",f_matrix.sum(axis=0)print "f_matrix, row sum",f_matrix.sum(axis=1)

ef2d567fd0266661d3d676991128c0a04adf5e7b

采用下面的方法将矩阵的元素进行求逆运算。

# 对元素进行逆运算display_shape(f_matrix[::-1])

copy函数可以复制一个矩阵,方法如下。

# Python中所有元素都能用来引用# 如果需要复制,可以使用copy命令f_copy = f_matrix.copy()

最后再看一下mgrid函数。

# Grid命令xx,yy,zz = np.mgrid[0:3,0:3,0:3]xx = xx.flatten()yy = yy.flatten()zz = zz.flatten()

mgrid函数用来查找m维矩阵中的坐标,在前面的示例中,矩阵是三维的,在每一维中,数值的范围从0到3。我们将xx、yy和zz打印输出出来以帮助理解,如图2-7所示。

我们来看每个数组的第1个元素,在本例的三维矩阵空间中,[0,0,0]是第1个坐标,所有3个数组中的第2个元素[0,0,1]是矩阵空间里的另一个点。据此,使用mgrid函数, 我们能占满三维坐标系统里的所有点。

144466a1697326737e8c8b53de0898a2b97aeb06

NumPy提供了一个random模块给我们,可以用来定义产生随机数的规则。我们来看产生随机数的示例。

# 随机数general_random_numbers = np.random.randint(1,100, size=10)print general_random_numbers

使用random模块中的randint函数,我们可以生成随机整数。我们需要传递start、end和size等3个参数。本例中,我们的起始值为1,结束值为100,步长为10。我们需要介于1到100的10个随机整数,我们得到的返回结果如图2-8所示。

69090382d92e69f0dd8eb424d0e4a6a1ff4ce92a

我们也可以使用其他包来产生随机数,来看看使用normal包产生10个随机数的示例。

uniform_rnd_numbers = np.random.normal(loc=0.2,scale=0.2,size=10)print uniform_rnd_numbers

我们使用normal包的normal函数来生成随机数。normal包里的loc和scale参数分别指定了均值和标准差两个参数,最后,size参数决定了样本的数量。

通过传递一个行或列的元组,我们也可以产生一个随机的矩阵,示例如下。

uniform_rnd_numbers = np.random.normal(loc=0.2,scale=0.2,size=(3,3))

上面的示例产生了3×3的矩阵,输出结果如图2-9所示。

471a32c1d62ac19ba33e65dda7e280b87515d232

2.2.4 更多内容

下面的链接提供了一些优秀的NumPy文档,请参见:。

2.2.5 参考资料

《Analyzing Data -Explore & Wrangle》的第3章中“使用matplotlib进行绘画的诀窍”部分有相关介绍。

《Analyzing Data -Explore & Wrangle》的第3章中“使用Scikit Learn进行机器学习的诀窍”部分有相关介绍。

转载地址:http://icytx.baihongyu.com/

你可能感兴趣的文章
cf 0.2 版本发布,lua 开发的另一种美
查看>>
SAP权限对象的校验
查看>>
kubernetes一些简单的基础知识
查看>>
zabbix snmp模板通用
查看>>
08.Java反射问题
查看>>
这份2019年5G手机购机指南,请各位老铁们收好! ...
查看>>
同样做前端,为何差距越来越大?
查看>>
数据可视化
查看>>
B2B跨境电子商务平台综合服务解决方案
查看>>
基于AWS云服务的大数据与大规模计算的应用架构 ...
查看>>
Java总结 - 类加载机制
查看>>
linux 本地终端 SSH 连接 gcp (Google Cloud Platform ) 配置教程 ...
查看>>
Python进阶:自定义对象实现切片功能
查看>>
深入解析redis cluster gossip机制
查看>>
程序员初入公司:10大经验让你能力提升20倍!
查看>>
SparkSQL ThriftServer 安全相关功能的现状分析
查看>>
Linkerd + Namerd,实现Kubernetes 集群的灰度发布
查看>>
SonarQube 7.7 发布,代码质量管理平台
查看>>
【对讲机的那点事】带你玩转灵通LD-7900数字对讲机如何发送短信
查看>>
金融科技企业泛付PanPay获源码资本数千万元Pre-A轮融资
查看>>