使用NumPy数组可以使你利用简单的数组表达式完成多种数据操作任务,而无须写些大量循环。这种利用数组表达式来替代显式循环的方法,称为向量化。通常,向量化的数组操作会比纯Python的等价实现在速度上快一到两个数量级(甚至更多),这对所有种类的数值计算产生了最大的影响。附录A中我解释的广播机制,就是向量化计算的有效方式。
作为一个简单的示例,假设我们想要对一些网格数据来计算函数sqrt(x^2 + y^2)的值。np.meshgrid函数接收两个一维数组,并根据两个数组的所有(x, y)对生成一个二维矩阵,并使用matplotlib函数imshow根据函数值生成图像:
1 | import numpy as np |
将条件逻辑作为数组操作,numpy的where函数是三元表达式x if condition else y的向量化版本。
许多关于计算整个数组统计值或关于轴向数据的数学函数,可以作为数组类型的方法被调用。你可以使用聚合函数(通常也叫缩减函数),比如sum、mean和std(标准差),既可以直接调用数组实例的方法,也可以使用顶层的NumPy函数。像means,sum函数可以接收一个可选参数axis,用于计算给定轴上的统计值,形成一个下降一维的数组。下表是基础数组统计方法:
方法 | 描述 |
---|---|
sum | 沿轴向计算所有元素的累和,0长度的数组累和为0 |
mean | 数学平均值,0长度的数组的平均值为NaN |
std,var | 标准差,方差 |
min,max | 最小值和最大值 |
argmin,argmax | 最小最大值的位置 |
cumsum | 从0开始元素累和 |
cumrod | 从1开始元素累积 |
对于布尔值数组,有两个非常有用的方法any和all。any检查数组中是否至少有一个True,而all检查是否每个值是否都为True
对于排序而言,NumPy数组可以使用sort函数位排序,也可以对不同的axis进行排序,顶层的np.sort()返回的是已排好序的数组而不是对原数组的位置排序。
对于一些NumPy的nadarray的基础集合操作如下:
方法 | 描述 |
---|---|
unique(x) | 计算x的唯一值并排序 |
intersect1d(x,y) | 计算x和y的交集,并排序 |
union1d(x,y) | 计算x和y的并集,并排序 |
in1d(x,y) | 计算x中的元素是否包含在y中,返回一个布尔值数组 |
setdiff1d(x,y) | 差集,在x中但不在y中的x的元素 |
setxor1d(x,y) | 异或集,在x或y中,当不属于x、y交集的元素 |