数组操作
对于Ndarray,常用的操作是迭代。除此之外还有位操作、字符串操作、算数计算、统计、排序等等。下面将选择几个比较常用的操作进行简单介绍。对于其他操作可以参考NumPy的文档,根据需要进行选择。
元素操作
操作数组时最基础的操作当属针对数组内的元素进行增删的操作,Ndarray在增删元素时没有采用Python列表的常用操作,而是提供了一系列的方法来完成相关操作。
numpy.resize(arr, shape)
,返回指定大小的新数组,如果新数组较原数组大,则原数组的一部分元素将会被重复以填充空位。numpy.append(arr, values, axis)
,向指定数组的指定轴向上添加元素。numpy.insert(arr, obj, values, axis)
,向指定数组的指定轴向上的指定值之前插入值。如果未提供axis
参数,则输入数组会被展开。numpy.delete(arr, obj, axis)
,返回从输入数组中删除指定子数组之后的新数组。
迭代
NumPy提供了numpy.nditer()
函数用来创建一个多维迭代对象,可以使用Python的迭代操作访问。
如果两个数组都是可广播的,那么nditer
组合对象就可以同时迭代它们。
变换操作
NumPy提供了以下针对Ndarray的常用变换操作。
numpy.reshape(arr, newshape, order)
,不改变数据的条件下修改形状。arr
参数表示要修改形状的数组;newshape
参数表示用于描述新形状的整数或者整数数组;order
参数表示元素在内存中的出现顺序,可取'C'
、'F'
、'A'
。
ndarray.flat
,数组上的一维迭代器。ndarray.flatten(order)
,返回折叠为一维的数组副本。numpy.ravel(arr, order)
,返回连续的展开数组。numpy.transpose(arr, axes)
,翻转数组维度。axes
接受一个整数的列表,用于对应转置的维度。
numpy.rollaxis(arr, axis, start)
,向后滚动指定轴。axis
参数表示要向后滚动的轴,其他轴的相对位置不会改变;start
参数表示滚动到的特定位置。
numpy.swapaxes(arr, axis1, axis2)
,互换数组的两个轴。axis1
参数表示第一个轴;axis2
参数表示第二个轴。
numpy.broadcast(arr1, arr2)
,产生模仿广播的对象。arr1
参数表示广播来源;arr2
参数表示广播接收目标。
numpy.broadcast_to(arr, shape, subok)
,将数组广播到新形状。numpy.expand_dims(arr, axis)
,扩展数组的形状。axis
表示新轴插入的位置。
numpy.squeeze(arr, axis)
,从数组的形状中删除一个维度。axis
表示要删除的维度,接收一个整数或者一个整数列表。
连接与分隔
对于数组的连接,NumPy也提供了常用的几种连接方法来将多个数组连接成为一个新的数组。这里需要注意的是Ndarray是一个多维数组,在进行数据连接时需要关注连接的轴向。
numpy.concatenate((arr1, arr2, ...), axis)
,沿着指定轴向或者现有轴向连接数组。numpy.stack([arr1, arr2, ...], axis)
,沿着指定轴向堆叠相同形状的数组序列。numpy.hstack(arrays)
,沿水平轴堆叠相同形状的数组序列。numpy.vstack(arrays)
,沿竖直轴堆叠相同形状的数组序列。
数组之间可以进行连接,那么也可以对一个数组进行拆分。对于数组的拆分,Numpy只提供了一个函数来实现拆分功能,另有两个衍生的快捷拆分函数,只是节省了拆分轴向的指定。
numpy.split(arr, indices, axis)
,沿指定轴向将数组分隔为子数组,返回数组列表。indices
可以是整数,表示要拆分成的等大小子数组数量;也可以是一维整数数组,表示进行切割的索引位置。
numpy.hsplit(arr, indices)
,水平切割数组。numpy.vsplit(arr, indices)
,竖直切割数组。
算数运算
NumPy的算数运算功能与Python标准库中math库的一部分功能是存在重复的,可以根据喜好来使用。但是需要注意的是NumPy中提供的运算功能都是可以直接应用于Ndarray并且直接返回逐元素处理后的Ndarray的,这是Python标准库所不能企及的。
- 全部标准三角函数。
numpy.around(arr, decimal)
,逐元素进行四舍五入,decimal
参数表示要保留的小数位数。numpy.floor(arr)
,逐元素返回不大于输入参数的最大整数。numpy.ceil(arr)
,逐元素返回输入值的上限整数。numpy.add(arr1, arr2)
、numpy.subtract(arr1, arr2)
、numpy.multiply(arr1, arr2)
、numpy.divide(arr1, arr2)
,加减乘除运算,要求输入的数组必须具有相同的形状或者符合数组广播规则。numpy.reciprocal(arr)
,返回逐元素的倒数。numpy.power(arr, pow)
,返回以逐元素为底数,pow
为指数的幂。numpy.mod(arr1, arr2)
,返回两个数组逐元素相除的余数。
统计
作为数据计算的扩展库,NumPy必然也提供了全面的统计计算功能。这里对常用的一些统计功能进行列举,具体这些统计功能的实际用途与意义还需要参考专门的统计类书籍。
numpy.amin(arr, axis)
,沿指定轴向返回最小值。numpy.amax(arr, axis)
,沿指定轴向返回最大值。numpy.ptp(arr, axis)
,沿指定轴向返回值的范围。numpy.percentile(arr, q, axis)
,百分位数是统计中使用的度量,表示将数组从小到大排序,并将样本值区间划分为100等分,某一百分位所对应的数据就成为这一百分位的百分位数。q
值表示要计算的百分位数。numpy.median(arr, axis)
,获取将数组的上半部分与下半部分分开的中值。numpy.mean(arr, axis)
,获取数组的算术平均值。numpy.average(arr, weights, returned, axis)
,计算数组的加权平均值,其中weights
是与数组相同长度用于表示数组元素权重的权重数组。returned
参数用于指示是否返回权重的和。numpy.std(arr, axis)
,计算标准差,即\(\sigma=\sqrt{\frac{\sum_{i=1}^{N}(x_{i}-\overline{x})^{2}}{N}}\)。numpy.var(arr, axis)
,计算方差,即\(\sigma^{2}=\frac{\sum_{i=1}^{N}(x_{i}-\overline{x})^{2}}{N}\)。
排序
排序也是对数组中的元素经常要做的一种操作,NumPy提供了三种排序算法可供使用,这三种算法都具有不同的性能和稳定性。
算法 | 速度 | 复杂度 | 空间占用 | 稳定性 |
---|---|---|---|---|
quicksort | 1 | \( O(n^{2}) \) | 0 | 否 |
mergesort | 2 | \(O(n\log{n})\) | \(\frac{n}{2}\) | 是 |
heapsort | 3 | \(O(n\log{n})\) | 0 | 否 |
NumPy提供了以下排序函数来对数组进行排序。
numpy.sort(arr, axis, kind, order)
,其中kind
用于指定要使用的排序算法,默认会使用quicksort
。numpy.argsort(arr, axis, kind)
,沿给定轴向进行间接排序,并使用指定排序算法返回数据的索引数组。numpy.lexsort(arr, axis)
,使用键序列执行间接排序,返回一个索引数组。
搜索
搜索是NumPy中较为神奇的一个功能。Ndarray可以使用numpy.where()
函数返回的索引序列来获取满足条件的元素,并形成一个新的Ndarray。
numpy.where()
接受一个布尔表达式来形成索引序列。具体可见以下示例。
import numpy as np
arr = np.arange(9.)
condi = np.where(arr > 3)
print(arr[condi])
# 以下使用索引的语法也可以达到同样的效果
print(arr[arr > 3])