20 数组高阶操作函数(下)
Numpy 提供了一系列针对数组操作的高阶函数,除了比较常见的合并,还有分割、追加、插入等操作。
1. 数组的分割
1.1 numpy.split 函数
numpy.split 函数将数组的副本沿指定轴划分为子数组。该函数的原型如下:
numpy.split(arr, indices_or_sections, axis=0)
参数说明如下:
| 参数 | 说明 | 
|---|---|
| arr | 待拆分的输入数组 | 
| indices_or_sections | 整数,表示要从输入数组创建的相等大小的子数组的数量。如果是1-D数组,则条目指示要创建新子数组的点。 | 
| axis | 连接数组的轴的方向,默认值为0 | 
案例
对于一维数组的情形,非常简单。创建1维数组:
arr_1 = np.array([12, 23, 34, 45, 56, 67, 78, 89, 100, 110, 120, 130])
利用numpy.split函数将arr_1等分为3块:
np.split(arr_1, 3)
out:
    [array([12, 23, 34, 45]), array([56, 67, 78, 89]), array([100, 110, 120, 130])]
当 indices_or_sections 参数为常数时,numpy.split 函数是讲数组进行等分。对于无法等分的情况,会报 ValueError 的错误。
当 indices_or_sections 参数为整数列表时,表示按照以整数为位置索引进行分割:
np.split(arr_1, [3, 6])
out:
    [array([12, 23, 34]), array([45, 56, 67]), array([ 78,  89, 100, 110, 120, 130])]
案例
对于多维数组的情形,将内层的数组视为整体,仅考虑最外层的大小进行切割:
arr_2 = arr_1.reshape(6,2)
arr_2
out:
    array([[ 12,  23],
       [ 34,  45],
       [ 56,  67],
       [ 78,  89],
       [100, 110],
       [120, 130]])
对 arr_2 进行切割:
np.split(arr_2, 3)
out:
    [array([[12, 23],[34, 45]]), 
     array([[56, 67],[78, 89]]), 
     array([[100, 110],[120, 130]])]
案例
可以通过指定 axis 来限制实际产生分割的维度。例如,对 arr_2 控制分割点在水平位置(axis=1):
np.split(arr_2, 2, axis=1)
out:
    [array([[ 12],
        [ 34],
        [ 56],
        [ 78],
        [100],
        [120]]), array([[ 23],
        [ 45],
        [ 67],
        [ 89],
        [110],
        [130]])]
需要注意比较 axis=1 和默认(axis=0)参数时的区别。
1.2 numpy.hsplit 函数
numpy.hsplit 是 split() 函数的一个特例,其中 axis 为 1 表示水平分割,与输入数组的维度无关。
案例
对上述指定 axis=1(水平分割)时的分割效果,可以用 numpy.hsplit 改写如下:
np.hsplit(arr_2, 2)
out:
    [array([[ 12],
        [ 34],
        [ 56],
        [ 78],
        [100],
        [120]]), array([[ 23],
        [ 45],
        [ 67],
        [ 89],
        [110],
        [130]])]
1.3 numpy.vsplit 函数
numpy.vsplit 是 split() 函数的一个特例,其中 axis 为 1 表示垂直分割,与输入数组的维度无关。
案例
对于上述指定 axis=0(默认参数)时的分割效果,可以用 numpy.vsplit 改写如下:
np.vsplit(arr_2, 3)
out:
    [array([[12, 23],[34, 45]]), 
     array([[56, 67],[78, 89]]), 
     array([[100, 110],[120, 130]])]
2. 数组追加
2.1 numpy.append 函数
numpy.append 函数可以在输入数组末尾,追加一个尺寸匹配的数组,与列表中 append 的操作类似。但是输入数组的尺寸必须匹配,否则将生成 ValueError。该函数的原型如下:
numpy.append(arr, values, axis)
参数说明如下:
| 参数 | 说明 | 
|---|---|
| arr | 输入数组 | 
| values | 待追加的数组,values在不包括附加轴的情况下,其形状需与arr保持一致 | 
| axis | 附加操作的轴。如果没有给出,则两个参数会先折叠为一维 | 
案例
以二维数组为例,对 arr_2 的 axis=0 方向追加数组:
np.append(arr_2, [[1, 2]], axis=0)
out:
    array([[ 12,  23],
       [ 34,  45],
       [ 56,  67],
       [ 78,  89],
       [100, 110],
       [120, 130],
       [  1,   2]])
案例
以二维数组为例,对 arr_2 的 axis=1 方向追加数组:
np.append(arr_2, [[1], [2], [3], [4], [5], [6]], axis=1)
out:
    array([[ 12,  23,   1],
       [ 34,  45,   2],
       [ 56,  67,   3],
       [ 78,  89,   4],
       [100, 110,   5],
       [120, 130,   6]])
案例
当不指定 axis 时,在追加动作产生前,会先把输入数组展平:
np.append(arr_2, [[1], [2], [3], [4], [5], [6]])
out:
    array([ 12,  23,  34,  45,  56,  67,  78,  89, 100, 110, 120, 130,   1, 2,   3,   4,   5,   6])
当不指定axis时,append结果为一维数组。
3. 数组的插入
3.1 numpy.insert 函数
numpy.insert 函数沿给定轴和给定索引之前在输入数组中插入值。该函数的原型如下:
numpy.insert(arr, obj, values, axis)
参数说明如下:
| 参数 | 说明 | 
|---|---|
| arr | 输入数组 | 
| obj | 待插入位置的索引 | 
| values | 待插入的值数组 | 
| axis | 要插入的轴。如果没有指定,则输入数组会先折叠为一维 | 
案例
对于不指定 axis 的情形:
np.insert(arr_2, 2, [123, 456])
out:
    array([ 12,  23, 123, 456,  34,  45,  56,  67,  78,  89, 100, 110, 120, 130])
可以发现,对于 insert 函数,新插入的元素从指定的位置(索引为2)开始,其他元素往后平移。
案例
指定在 axis=0 的轴上插入新元素:
np.insert(arr_2, 2, [123, 456], axis=0)
out:
    array([[ 12,  23],
       [ 34,  45],
       [123, 456],
       [ 56,  67],
       [ 78,  89],
       [100, 110],
       [120, 130]])
案例
当指定插入的元素跟输入数组形状不一致时,可以通过广播规则进行传播补齐。当不满足广播规则,则会报 ValueError 的错误。
np.insert(arr_2, 2, [123], axis=0)
out:
    array([[ 12,  23],
       [ 34,  45],
       [123, 123],
       [ 56,  67],
       [ 78,  89],
       [100, 110],
       [120, 130]])
案例
指定在 axis=1 的轴上插入新元素:
np.insert(arr_2, 2, [1, 2, 3, 4, 5, 6], axis=1)
out:
    array([[ 12,  23,   1],
       [ 34,  45,   2],
       [ 56,  67,   3],
       [ 78,  89,   4],
       [100, 110,   5],
       [120, 130,   6]])
4. 小结
本节讲述了数组分割与追加的常用方法,其中append函数与insert函数在不指定操作轴的时候,函数会首先对输入数组进行展开操作。而hsplit和vsplit则是已经默认了计算方向,使用过程中注意区分。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
