Python科学计算之NumPy

486 查看

本文是我在Python程序员官方微信公众号看到的一篇文章,翻译的质量不错,也正好学习下NumPy这个数学库,所以,转载出来,如果需要了解更多的有关Python的精彩文章,请关注他们的官方公众号Python部落(python.freelycode.com)。

哦,你可以用NumPy做惊人的事情。

NumPy是Python用于处理大型矩阵的一个速度极快的数学库。它允许你在Python中做向量和矩阵的运算,而且很多底层的函数都是用C写的,你将获得在普通Python中无法达到的运行速度。

如果你想进入数据科学或Python中的机器学习,NumPy绝对是科学计算Python成功的关键,因此它是必须要学习的。在我看来NumPy结构设计良好,因此用起来并不困难。

这是关于Python科学系列的第二部分,不要忘记去看看其他部分。

数组基础

创建

NumPy的功能围绕着一些叫数组的东西。其实NP矩阵,但我们并不需要担心。有了这些数组,我们可以做各种有用的东西,如快速处理向量和矩阵数学。用上你的线性代数吧!(开个玩笑,我们不会做任何大的数学计算)

上面的代码展示了创建一个数组4种不同的方法。最基本的方法就是传递一个序列给NumPy的array()函数;你可以传递给它任何的序列,不仅仅是你通常看到的列表。

注意当我们打印一个不同长度的数组时,它会自动将他们拉长。在查看矩阵的时候这非常有用的。索引数组的工作就像是索引Python的序列列表,你还可以使用切片,我不会再这里切一个一维数组,如果你想知道更多关于切片的消息,看看这篇文章。

上面的数组例子是如何用NumPy表示一个向量。接下来我们就来看看我们如何可以展示矩阵和更多的多维数组。

为了创建一个二维数组,我们传递一个列表的列表给array()函数(或者一个序列的序列)。如果我们想要一个三维数组,我应该传递一个列表的列表的列表,一个四维的数组将会需要传递一个列表的列表的列表的列表等。

注意如何将一个二维数组(在我们的空格键朋友的帮助下),被布置成行和列。要索引一个二维数组,我们只应用一行和一列。

其背后的数学

要正确的理解这一点,我们真的应该看看什么是向量矩阵

向量是同时具有方向和大小的量。它们通常被用来表示这些东西,如速度,加速度和动量。向量可以用多种方式表达,但是对我们最有用方式是以n元组的形式如(1,4,6,9)。这也是我们在NumPy中的表达方式。

矩阵类似于向量,除了它是由行和列组成外,更像一个网格。矩阵中的值可以通过给对应的行和列来引用。在NumPy中我们像前面做的那样传递一个序列的序列来创建数组。

多维数组切片

将一个多维数组切片比一维的切片更加复杂一些,但你在用NumPy的时候你将做到很多这方面的事情。

正如你看到的你把一个多维数组切割成为每个维度以逗号分隔的一个单独的层。因此一个二维数组的第一个切片定义了行,第二个切片定义了列。

请注意,你可以简单地输入数字指定一行或一列,上面的第一个例子从数组中选择了第0列。

下面的图说明了给定的例子中的切片做了什么。

数组属性

使用NumPy时你可能会想知道关于你的数组的某些事情。幸运的是,在包里面有许多方便的方法可以给你需要的信息。

正如你上面看到的一个NumPy数组通常被叫做ndarray。我不知道为什么它被成为一个ndarray,如果有人知道请留言!我的猜测是,它代表n维数组。

一个数组的形状由它的行数和列数决定,上面的数组有5行5列,因此它的形状是(5,5)。

“itemsize”属性是每项占用了多少个字节。这个数组的数据类型是int64,int64有64位,每个字节8位,64除以8然后你就可以知道它占用了多少字节,在本例中是8个字节。

“ndim”属性是指某个数组是几维的,这个数组是2,然而例子中的向量是1。

“nbytes”属性是某个数组中所有数据所占用的字节。你应该注意到这并不算一个数组的开销,所以实际数组占用的空间会更大一点。

处理数组

基本操作

仅仅能够从一个数组中获取和检索元素和属性并不能让你走的很远,你也需要对他们做一些数学计算。你可以用基本的运算符,如+,-,/,等等。

一个数组中除了dot()函数,其他这些操作都是可以单元操作。例如(a, b, c) + (d, e, f)可以写成(a+d, b+e, c+f)。它将每个元素独立分开,将对应的元素进行算术运算。然后,它将返回一个数组的结构。注意,当使用逻辑运算符如<and>将返回一个布尔值数组,在后面的学习过程中它将会是一个非常有用的应用程序。

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

其背后的数学

dot()函数有时候被称为点积。最好的理解方式是看它是如何计算的。

数组中特定的操作

NumPy提供了一些非常有用的操作来处理一个数组。

很明显的知道sum(),min()和max()函数的功能是什么。分别是计算所有元素的和,找出最小和最大的元素。

然而cumsum()函数就不那么明显了。它和sum()类似把所有元素的相加,但是它先将数组第一行的元素相加放到一个列表中作为第一项,然后第二行元素相加放到列表中的第二项,再次将第三行的元素相加存储到列表中。这样做是为了将数组中的所有元素之和返回到一个列表中。

高级索引

奇特的索引

“奇特的索引”是一个非常有用的方式来挑选出你想要的使用的特定数组元素

正如你看到的上面的例子中我们用特定索引的序列来索引数组。这反过来又返回给我们一个索引的元素列表。

布尔屏蔽

布尔屏蔽是一个奇妙的特性,它允许我们按照我们指定的条件来检索元素。

上面的例子展示了如何做布尔屏蔽。你所要做的是给数组传递一个条件,它将会给你返回一个符合条件的数组。

这个例子产生如下基址图:

在这个图上我们使用条件来选择不同的点。图中蓝色的点(还包括绿色的点,但是绿点掩盖了蓝色的点),显示所有的点值大于0。绿色的点显示了所有值大于0且小于π一半的值。

不完整的索引

从多维数组的第一个维度取一个索引或切片,不完整的索引是一个很方便的方法。例如如果你有一个数组a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]],a[3]会指出数组中第一维度的索引为3的元素,这里是数值4.

Where

where()函数是另一个有用的方式,当需要以特定条件来检索数组元素的时候。只需要传递给它一个条件,它将返回符合条件的元素列表。

那就是NumPy,不是那么难对吧?当然这篇文章只涵盖了基本知识来促使你前进,当你熟悉这些基础知识你还可以用NumPy做许多其他的事情。你应该看一看。

版权声明:本文转自Python部落(python.freelycode.com)(关注Python程序员官方微信号),仅做学习numpy之用,如需它用,请联系原作者。

相关文章:
有关python的基础文章,请看我的OSC博客:Python快速开发学习