《Python数据科学指南》——2.2 使用NumPy库

2.2 使用NumPy库

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

2.2.1 准备工作

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

2.2.2 操作方法

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

# Recipe_1a.py
# 导入NumPy库,命名为np
import 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
     print

display_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库,命名为np
import 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列。

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

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

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

http://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html。

# 创建数组的另一种替代办法
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)

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

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

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)

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

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

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所示。

print
print "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)

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

# 对元素进行逆运算
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函数, 我们能占满三维坐标系统里的所有点。

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所示。

我们也可以使用其他包来产生随机数,来看看使用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所示。

2.2.4 更多内容

下面的链接提供了一些优秀的NumPy文档,请参见:http://www.numpy.org/。

2.2.5 参考资料

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

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

时间: 2024-09-16 09:51:04

《Python数据科学指南》——2.2 使用NumPy库的相关文章

《Python数据科学指南》——导读

前 言 如今,我们生活在一个万物互联的世界,每天都在产生海量数据,不可能依靠人力去分析产生的所有数据并做出决策.人类的决策越来越多地被计算机辅助决策所取代,这也得益于数据科学的发展.数据科学已经深入到我们互联世界中的每个角落,市场对那些十分了解数据科学算法并且有能力用这些算法进行编程的人才需求是不断增长的.数据科学是多领域交叉的,简单列举几个:数据挖掘.机器学习.统计学等.这对那些渴望成为数据科学家以及已经从事这一领域的人们在各方面都倍感压力.把算法当成黑盒子应用到决策系统里,可能会适得其反.面

《Python数据科学指南》——1.20 从表格数据使用数组

1.20 从表格数据使用数组 数据科学的应用程序要成功解决一个问题,必须先找到适当的处理数据的方法.例如在机器学习中对数据进行预测或分类,要么采用有监督的方法,要么采用无监督的方法.而在此之前,传输数据,把数据清洗到匹配算法,可能已经花费了很长的时间. 通常,有很多种方法对数据进行整理使之适合数据科学程序进行处理,数据科学程序开发者首先面对的挑战是如何访问数据,并用Python的数据结构让这些数据持续可用.掌握使用Python访问数据的诀窍是非常有用的,能让你避过纷扰,直接面对问题的核心内容.

《Python数据科学指南》——1.2 使用字典对象

1.2 使用字典对象 在Python语言中,容器是一种对象,它能够容纳任意数量.任意类型的对象.它可以对子对象进行操作,还可以迭代操作.字典.元组.列表还有集合都是容器对象.在collections模块中,Python提供了更多的容器类型.在这一节中,我们先来仔细了解字典. 1.2.1 准备工作 我们先通过一个Python的脚本示例来理解字典是如何操作的,这段脚本用来统计词频,也就是每个词在给定的文本中出现的次数. 1.2.2 操作方法 下面的示例演示了在Python中对字典对象如何操作.通过对

《Python数据科学指南》——2.3 使用matplotlib进行绘画

2.3 使用matplotlib进行绘画 Matplotlib是Python提供的一个二维绘图库,所有类型的平面图,包括直方图.散点图.折线图.点图.热图以及其他各种类型,都能由Python制作出来.在本书中,我们将采用matplotlib的pyplot接口实现所有的可视化需求. 2.3.1 准备工作 本节中,我们会介绍使用pyplot的基础绘图框架,并且用它来完成本书中的所有可视化需求. 本书采用的是matplotlib1.3.1,你可以在命令行下调用_version_属性来检查版本,如图2-

《Python数据科学指南》——1.3 使用字典的字典

1.3 使用字典的字典 我们之前提到,为了完成目标,你得创造性地应用各类数据结构,这样才能发挥它们的威力.接下来,我们通过一个实例来帮助理解"字典的字典". 1.3.1 准备工作 请看表1-1. 第1列中列出了3个用户,其他列都是电影,单元格里是每个用户给电影的评分.我们要把这些数据放到内存中,这样大型程序的其他部分也能方便地访问,此时我们将使用"字典的字典". 1.3.2 操作方法 我们通过匿名函数来创建一个user_movie_rating的字典对象,以此展示&

《Python数据科学指南》——第1章 Python在数据科学中的应用 1.1 简介

第1章 Python在数据科学中的应用 在这一章里,我们将探讨以下主题. 使用字典对象 使用字典的字典 使用元组 使用集合 写一个列表 从另一个列表创建列表--列表推导 使用迭代器 生成一个迭代器和生成器 使用可迭代对象 将函数作为变量传递 在函数中嵌入函数 将函数作为参数传递 返回一个函数 使用装饰器改变函数行为 使用lambda创造匿名函数 使用映射函数 使用过滤器 使用zip和izip函数 从表格数据使用数组 对列进行预处理 列表排序 采用键排序 使用itertools 1.1 简介 Py

《Python数据科学指南》——1.4 使用元组

1.4 使用元组 在Python中,元组是一种顺序型的容器对象.元组是不可变的,元组中的元素由逗号分隔开,可以对不同类别构成的对象进行排序,不允许插入操作,支持以下操作. in和not in. 比较.串联.切片和索引.min ()和max (). 1.4.1 准备工作 我们讲解字典的时候,描述了完整的功能,对于元组,我们通过一些小段的代码来聚焦于元组的创建与维护操作. 1.4.2 操作方法 先让我们看看一些元组创建和维护的示例代码. # 1.创建一个元组 a_tuple = (1,2,'a')

《Python数据科学指南》——1.8 使用迭代器

1.8 使用迭代器 毫无疑问,对于数据科学的程序而言,数据是极其重要的输入.数据的大小是可变的,有些能装载到内存中,有些则不能.而记录访问架构也是随一种数据格式到另一种而变化.有趣的是,不同的算法处理数据时,需要的是可变长度的组块.例如,假如你在写一个随机梯度下降的算法,你希望在每个时间片传送5000条记录的数据块,如果你对如何访问数据.理解数据格式.依次传送数据.给调用者需要的数据等流程有着清晰的概念,那你才能成功.这样能让你写出清晰的代码.大多数时候,最有趣的部分是我们如何处理数据,而不是我

《Python数据科学指南》——1.10 使用可迭代对象

1.10 使用可迭代对象 可迭代对象和生成器十分相似,但是有一个重要的区别:我们可以重复地访问一个可迭代对象,即使我们已经访问完了序列中的所有元素,我们还可以从头重新访问它,这和生成器是完全不同的. 如果不保持任何状态,它们就是基于对象的生成器.所有带有iter方法的类,在用来产生数据时,都可以被作为无状态对象生成器来使用. 1.10.1 准备工作 我们通过一个简单的示例来理解可迭代对象.如果理解了之前介绍的生成器和迭代器,你也能很容易地理解这个概念. 1.10.2 操作方法 我们来创建一个简单