使用Python进行科学计算:NumPy入门

编程派微信号:codingpy

本文由 Python 翻译组 最新翻译出品,原作者为 Jamal Moir,译者为 cystone,并由编程派作者EarlGrey 校对。这是使用 Python 进行科学计算的系列文章,上一篇可点此查看:Matplotlib 快速入门。

译者简介:cystone, 成都信息工程大学,计算机学院学生。擅长领域:图像处理,机器学习。

你可以用 NumPy 做很多有趣的事情。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算。它可以让你在 Python 中使用向量和数学矩阵,以及许多用 C 语言实现的底层函数,你还可以体验到从未在原生 Python 上体验过的运行速度。

NumPy 是 Python 在科学计算领域取得成功的关键之一,如果你想通过 Python 学习数据科学或者机器学习,就必须学习 NumPy。我认为 NumPy 的功能很强大,而且入门也不难。

数组基础

创建数组

NumPy 的核心是数组(arrays)。具体来说是多维数组(ndarrays),但是我们不用管这些。通过这些数组,我们能以闪电般的速度使用像向量和数学矩阵之类的功能。赶紧捡起你的线性代数吧!(只是开玩笑,其实并不需要很多复杂的数学知识)

上边的代码展示了创建数组的四种不同方式。最基本的方式是传递一个序列给 NumPy 的 array() 函数;你可以传给它任意的序列,不仅仅是我们常见的列表之类的。

注意,当输出的数组中的数值长度不一样的时候,它会自动对齐。这在查看矩阵的时候很有用。数组的索引和 Python 中的列表或其他序列很像。你也可以对它们使用切片,这里我不再演示一维数组的切片,如果你想知道更多关于切片的信息,查看这篇文章。

上边数组的例子给你展示了如何在 NumPy 中表示向量,接下来我将带你们领略一下怎么表示矩阵和多维数组。

通过给 array() 函数传递一个列表的列表(或者是一个序列的序列),可以创建二维数组。如果我们想要一个三维数组,那我们就传递一个列表的列表的列表,四维数组就是列表的列表的列表的列表,以此类推。

注意二维数组是如何成行成列排布的(在我们的朋友空格的帮助下)。如果要索引一个二维数组,只需要引用相应的行数和列数即可。

背后的数学知识

为了更好的理解这些,我们需要来看一下什么是向量和矩阵。

向量是一个有方向和大小的量,通常用来表示速度、加速度和动量等。向量能以多种方式书写,但是我们最有用的方式是把它们写在有 n 个元素的元组里边,比如(1, 4, 6, 9)。这就是它们在 NumPy 中的表示方式。

矩阵和向量很像,除了它是由行和列组成的;更像一个网格(grid)。矩阵中的数值可以用它们所在的行和列来表示。在 NumPy 中,可以像我们前面所做的那样,通过传递序列的序列来创建数组。

多维数组切片

多维数组切片比一维数组要复杂一点,同时它也是你在用 NumPy 的时候经常会用到的。

就像你看到的一样,多维数组切片就是要分别在每个维度上切片,并用逗号隔开。在二维数组中,第一个切片的含义是对行切片,第二个切片的含义是对列切片。

值得注意的是,你通过输入数字来指定行和列。上边第一个例子是从数组中选择第 0 行。(注:原文为第 0 列,应该是作者笔误)

下边的这幅图阐明了上边切片的例子的含义。

数组属性

在使用 NumPy 时,你会想知道数组的某些信息。很幸运,在这个包里边包含了很多便捷的方法,可以给你想要的信息。

如你所看,在上边的代码中 NumPy 的数组其实被称为 ndarray。我不知道为什么它被称为 ndarray,如果有人知道请在下边留言!我猜测它是表示 n 维数组(n dimensional array)。

数组的形状(shape)是指它有多少行和列,上边的数组有五行五列,所以他的形状是(5,5)。

‘itemsize’ 属性是每一个条目所占的字节。这个数组的数据类型是 int64,一个 int64 的大小是 64 比特,8 比特为 1 字节,64 除以 8 就得到了它的字节数,8 字节。

‘ndim’ 属性是指数组有多少维。这个数组有二维。但是,比如说向量,只有一维。

‘nbytes’ 属性表示这个数组中所有元素占用的字节数。你应该注意,这个数值并没有把额外的空间计算进去,因此实际上这个数组占用的空间会比这个值大点。

使用数组

基本操作符

仅仅会赋值、取值和得到一些属性是不能满足你的需求的,有时候你还需要做一些数学运算。你可以利用基本的操作符实现这些,比如 +, -, /,等等。

除了 dot() 之外,这些操作符都是对数组进行逐元素运算。比如 (a, b, c) + (d, e, f) 的结果就是 (a+d, b+e, c+f)。它将分别对每一个元素进行配对,然后对它们进行运算。它返回的结果是一个数组。注意,当使用逻辑运算符比如 < 和 > 的时候,返回的将是一个布尔型数组,这点有一个很好的用处,后边我们会提到。

dot() 函数计算两个数组的点积。它返回的是一个标量(只有大小没有方向的一个值)而不是数组。

背后的数学知识

dot() 函数有时候也称为点积。理解这个函数的最好方法就是看下边它的计算过程。

数组的特定操作符

NumPy 还提供了一些其他很有用的操作符,用于处理数组。

很明显就能看出 sum()、min() 和 max() 函数的功能:将所有元素加起来,找到最小值和最大值。

cumsum() 函数就不是那么明显了。它像 sum() 那样把所有元素加起来,但是它的实现方式是,第一个元素加到第二个元素上,把结果保存到一个列表里,然后把结果加到第三个元素上,再保存到列表里,依次累加。当遍历完数组中所有元素则结束,返回值为运行数组的总和的列表。

cystone: 这里作者说的比较拗口,其实 cumsum() 就是一个累加计算并且保存每次累加的结果,返回值就是包含所有累加结果的一个列表。比如 np.array([1, 2, 3, 4, 5]).cumsum() = [1, 3, 6, 10, 15]

高级索引

花俏的索引

花俏的索引是获取数组中我们想要的特定元素的有效方法。

如你所见,上边的例子中,我们用想获取的索引的序列作为索引。它返回了我们索引的元素。

布尔过滤(boolean masking)

布尔过滤是一个奇妙的特性,它允许我们根据指定条件获取数组中的元素。

上边的代码展示了实现布尔屏蔽。你需要做的就是传递给数组一个与它有关的条件式,然后它就会返回给定条件下为真的值。

上边的例子将会生成下边这幅图:

我们用条件式选择了图中不同的点。蓝色的点(也包含图中的绿点,只是绿点覆盖了蓝点),显示的是值大于零的点。绿点显示的是值大于 0 小于 Pi / 2 的点。

缺省索引

缺省索引是从多维数组的第一维获取索引和切片便捷方法。例如,你有一个数组 a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]],那么 a[3] 将会返回数组第一维中索引值为 3 的元素,这里的结果是 4。

Where 函数

where() 函数是另外一个根据条件返回数组中的值的有效方法。只需要把条件传递给它,它就会返回一个使得条件为真的元素的列表。

这就是 NumPy,不算太难,对吧?当然,这些只是一些基础,NumPy 还有很多其他的功能,如果你已经熟悉了这些基础内容,你可以去探索一下。

不要忘了分享!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

触发修改文章时间【fastadmincms开发记录】|fastadmincms二次开发,触发,修改,文章,时间,fastadmin,ms,开发,记录
触发修改文章时间【fastadmincms开发记录】
在tp5中过滤输入的零宽度字符【fastadmincms开发记录】|fastadmincms二次开发,在tp5中,过滤,输入,的零,宽度,字符,fastadmin,ms,开发,记录
在tp5中过滤输入的零宽度字符【fastadmincms开发记录】
处理tag标签中的0宽空格【fastadmincms开发记录】|fastadmincms二次开发,处理,tag,标签,中的,0宽,空格,fastadmin,ms,开发,记录
处理tag标签中的0宽空格【fastadmincms开发记录】
添加专题时tags标签id出错【fastadmincms开发记录】|fastadmincms二次开发,添加,专题,时tags,标签,id,出错,fastadmin,ms,开发,记录
添加专题时tags标签id出错【fastadmincms开发记录】
20230518----模板 广告【fastadmincms开发记录】|fastadmincms二次开发,20230518,模板,广告,fastadmin,ms,开发,记录
20230518----模板 广告【fastadmincms开发记录】
cms添加视频模型【fastadmincms开发记录】|fastadmincms二次开发,ms,添加,视频,模型,fastadmin,开发,记录
cms添加视频模型【fastadmincms开发记录】
新增单篇收费复制功能【fastadmincms开发记录】|fastadmincms二次开发,新增,单篇,收费,复制,功能,fastadmin,ms,开发,记录
新增单篇收费复制功能【fastadmincms开发记录】
添加开会员折扣功能【fastadmincms开发记录】|fastadmincms二次开发,添加,开会,折扣,功能,fastadmin,ms,开发,记录
添加开会员折扣功能【fastadmincms开发记录】

历史上的今天:05月04日

热门专题

国家开放大学|国家开放大学报名,国家开放大学报考,国家开放大学,什么是国家开放大学,国家开放大学学历,国家开放大学学费,国家开放大学报名条件,国家开放大学报名时间,国家开放大学学历,国家开放大学专业
国家开放大学
安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
安徽中源管业有限公司|安徽中源管业有限公司,安徽中源管业有限公司介绍,安徽中源管业有限公司电话,安徽中源管业有限公司地址,安徽中源管业有限公司厂家,安徽中源管业有限公司电力管,安徽中源管业有限公司管材
安徽中源管业有限公司
昆明综合高中|昆明综合高中
昆明综合高中
大理科技管理学校|大理科技管理中等职业技术学校,大理市科技管理中等职业技术学校
大理科技管理学校
弥勒综合高中|弥勒综合高中
弥勒综合高中
小程序开发|微信小程序,小程序开发,小程序,小程序制作,微信小程序开发,小程序公司,小程序开发公司,分销,三级分销系统,分销系统
小程序开发
金诺幼儿园(春城路金诺幼儿园)|昆明官渡区幼儿园,幼儿园报名,官渡区幼儿园,春城路幼儿园,幼儿园招生,学前班,昆明幼儿园,金诺幼儿园,环城南路幼儿园,石井路幼儿园
金诺幼儿园(春城路金诺幼儿园)

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部