矢量化
NumPy数组可以将许多数据处理任务表述为简洁的数组表达式,否则需要编写循环。用数组表达式代替循环的做法,通常被称为矢量化。通常矢量化数组运算要比等价的纯Python方式快上一两个数量级,尤其是各种数值计算。
假设我们想要在一组值(网格型)上计算函数sqrt(x^2 + y^2)。np.meshgrid()函数接受两个一维数组,并产生两个二维矩阵,对应于两个数组中所有的(x, y)对。
points = np.arange(-5, 5, 0.01) #1000个间隔相等的点。xs, ys = np.meshgrid(points, points)z = np.sqrt(xs ** 2 + ys ** 2)
将条件逻辑表述为数组运算
- np.where()函数是三元表达式 x if condition else y的矢量化版本。假设我们有一个布尔数组和两个值数组:
- 这有一些问题。第一,它对大数组的处理速度不是很快;第二,无法用于多维数组。若使用np.where(),则可以将该功能写得非常简洁。
- np.where()的第二个和第三个参数不必是数组,也可以是标量值。where()通常用于根据另一个数组产生一个新的数组。
- np.where()可以表述更加复杂的逻辑。
#Pythonresult = []for i in range(n): if cond1[i] and cond2[i]: result.append(0) elif cond1[i]: result.append(1) elif cond2[i]: result.append(2) else: result.append(3)#NumPynp.where(cond1 & cond2, 0, np.where(cond1, 1, np.where(cond2, 2, 3)))#利用布尔值在计算过程中可以被当做0或1处理result = 1 * (con1 - cond2) + 2 * (con2 & -cond1) + 3 * -(cond1 | cond2)
数学和统计方法
用于布尔型数组的方法
- 在使用基本统计方法时,布尔值会被强制转换为1和0,因此sum经常被用来对布尔型数据中的True值计数。
- 另外还有两个方法any()和all(),它们对布尔型数组非常有用。any()用于测试数组中是否存在一个或多个True,而all()则检查数组中所有制是否都是True,两个方法均返回布尔值结果。这两个方法也可用于非布尔型数组,所有非0元素均会被当作True。
排序
- 与Python内置的列表类型一样,NumPy数组也可以通过sort方法就地排序(会对原数组进行操作)。
- 多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort即可。
- 顶级方法np.sort()返回的是数组的已排序副本,而就地排序则会修改数组本身。计算数组分位数最简单的方法是对其进行排序,然后取特定位置的值:
唯一化以及其他的集合逻辑。
- NumPy提供了一些针对一维ndarray()的基本集合运算,最常用的可能要数np.unique()了,它用于找出数组中的唯一值并返回已排序的结果。
- 拿跟np.unique()等价的纯Python代码对比一下:
- 另一个函数np.in1d()用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组: