一.通用函数:快速的元素级数组函数

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。你可以将 其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。

许多ufunc都是简单的元素级变体,如sqrt和exp:这些都是一元(unary)ufunc

另外一些(如add或maximum)接受2个数组(因 此也叫二元(binary)ufunc),并返回一个结果数组:这里,numpy.maximum计算了x和y中元素级别最大的元素。

虽然并不常见,但有些ufunc的确可以返回多个数组。modf就是一个例子,它是 Python内置函数divmod的矢量化版本,它会返回浮点数数组的小数和整数部分:

Ufuncs可以接受一个out可选参数,这样就能在数组原地进行操作:

我们可以观察有当接受一个out参数和没有一个out参数的区别:

从这里看出,ufuncs并不是直接对arr的视图做修改,当有选择out参数时:

表4-3和表4-4分别列出了一些一元和二元ufunc。

二 . 利用数组进行数据处理

NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化 数组运算要比等价的纯Python方式快上一两个数量级(甚至更多),尤其是各种数值计算。

作为简单的例子,假设我们想要在一组值(网格型)上计算函数sqrt(x^2+y^2)。np.meshgrid函数接受两个一维数组,并产生两个二维矩阵 (对应于两个数组中所有的(x,y)对):

这里我们来了解一下np.meshgrid函数的用法:

meshgrid的作用适用于生成网格型数据,可以接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对。接下来通过简单的ipython交互来演示一下这个功能的使用,并做一下小结。

由上面的交互可以看出,meshgrid函数的作用是根据传入的两个一维数组参数生成两个数组元素的列表。如果第一个参数是xarray,维度是 x dimesion,第二个参数是yarray,维度是 y dimesion。那么生成的第一个二维数组是以xarray为行,y dimesion行的向量;而第二个二维数组是以yarray的转置为列,x dimesion列的向量。

接上,现在,对该函数的求值运算就好办了,把这两个数组当做两个浮点数那样编写表达式即可:

1.将条件逻辑表述为数组运算

numpy.where函数是三元表达式x if condition else y的矢量化版本。假设我们有一个布尔数组和两个值数组:

假设我们想要根据cond中的值选取xarr和yarr的值:当cond中的值为True时,选取 xarr的值,否则从yarr中选取。列表推导式的写法应该如下所示:

这有几个问题。第一,它对大数组的处理速度不是很快(因为所有工作都是由纯 Python完成的)。第二,无法用于多维数组。若使用np.where,则可以将该功能写得非常简洁:

np.where的第二个和第三个参数不必是数组,它们都可以是标量值。在数据分析工 作中,where通常用于根据另一个数组而产生一个新的数组。假设有一个由随机数据组成的矩阵,你希望将所有正值替换为2,将所有负值替换为-2。若利用 np.where,则会非常简单:

使用np.where,可以将标量和数组结合起来。例如,我可用常数2替换arr中所有正的值:

用np.where传递的后两个参数如果是数组的话,其形状必须和前一个参数的数组形状相同。

2.数学和统计方法

可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算。 sum、mean以及标准差std等聚合计算(aggregation,通常叫做约简 (reduction))既可以当做数组的实例方法调用,也可以当做顶级NumPy函数使用。

这里,我生成了一些正态分布随机数据,然后做了聚类统计:

mean和sum这类的函数可以接受一个axis选项参数,用于计算该轴向上的统计值, 最终结果是一个少一维的数组:

这里注意:axis=0 是指对列做运算 ,axis=1 是对行进行运算 。

我们再来看看对于三维数组进行运算,关于轴axis的运算是什么情况:

我们 对于axis = 2时进行举例axis = 0时对每一列,按图自己分析。

3.用于布尔型数组的方法

在上面这些方法中,布尔值会被强制转换为1(True)和0(False)。因此,sum 经常被用来对布尔型数组中的True值计数:

另外还有两个方法any和all,它们对布尔型数组非常有用。any用于测试数组中是否 存在一个或多个True,而all则检查数组中所有值是否都是True:

4.排序

跟Python内置的列表类型一样,NumPy数组也可以通过sort方法就地排序:这里是对视图进行操作

多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort即可:

5.唯一化以及其它的集合逻辑

NumPy提供了一些针对一维ndarray的基本集合运算。最常用的可能要数np.unique了,它用于找出数组中的唯一值并返回已排序的结果:

另一个函数np.in1d用于测试一个数组中的值在另一个数组中的成员资格,返回一个 布尔型数组:NumPy中的集合函数:

三、用于数组的文件输入输出

NumPy能够读写磁盘上的文本数据或二进制数据。这一小节只讨论NumPy的内置 二进制格式。

np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未 压缩的原始二进制格式保存在扩展名为.npy的文件中的:

如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上。然后就可以通过 np.load读取磁盘上的数组:

通过np.savez可以将多个数组保存到一个未压缩文件中,将数组以关键字参数的形式传入即可:

加载.npz文件时,你会得到一个类似字典的对象,该对象会对各个数组进行延迟加 载:

如果要将数据压缩,可以使用numpy.savez_compressed:

四、线性代数

numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西,下表中列出了一些最常用的线性代数函数。