Nmupy 数组高阶操作函数

数组高阶操作函数

Numpy 提供了一系列针对数组操作的高阶函数,除了比较常见的合并,还有分割、追加、插入等操作。

1. 数组的分割

1.1 numpy.split 函数

numpy.split 函数将数组的副本沿指定轴划分为子数组。该函数的原型如下:

numpy.split(arr, indices_or_sections, axis=)

参数说明如下:

参数说明
arr待拆分的输入数组
indices_or_sections整数,表示要从输入数组创建的相等大小的子数组的数量。如果是1-D数组,则条目指示要创建新子数组的点。
axis连接数组的轴的方向,默认值为0

案例

对于一维数组的情形,非常简单。创建1维数组:

arr_1 = np.array([, , , , , , , , , , , ])

利用numpy.split函数将arr_1等分为3块:

np.split(arr_1, )out:[array([, , , ]), array([, , , ]), array([, , , ])]

当 indices_or_sections 参数为常数时,numpy.split 函数是讲数组进行等分。对于无法等分的情况,会报 ValueError 的错误。

当 indices_or_sections 参数为整数列表时,表示按照以整数为位置索引进行分割:

np.split(arr_1, [, ])out:[array([, , ]), array([, , ]), array([ ,  , , , , ])]

案例

对于多维数组的情形,将内层的数组视为整体,仅考虑最外层的大小进行切割:

arr_2 = arr_1.reshape(,)arr_2
out:array([[ ,  ],   [ ,  ],   [ ,  ],   [ ,  ],   [, ],   [, ]])

对 arr_2 进行切割:

np.split(arr_2, )out:[array([[, ],[, ]]), 
     array([[, ],[, ]]), 
     array([[, ],[, ]])]

案例

可以通过指定 axis 来限制实际产生分割的维度。例如,对 arr_2 控制分割点在水平位置(axis=1):

np.split(arr_2, , axis=)out:[array([[ ],[ ],[ ],[ ],[],[]]), array([[ ],[ ],[ ],[ ],[],[]])]

需要注意比较 axis=1 和默认(axis=0)参数时的区别。

1.2 numpy.hsplit 函数

numpy.hsplit 是 split() 函数的一个特例,其中 axis 为 1 表示水平分割,与输入数组的维度无关。

案例

对上述指定 axis=1(水平分割)时的分割效果,可以用 numpy.hsplit 改写如下:

np.hsplit(arr_2, )out:[array([[ ],[ ],[ ],[ ],[],[]]), array([[ ],[ ],[ ],[ ],[],[]])]

1.3 numpy.vsplit 函数

numpy.vsplit 是 split() 函数的一个特例,其中 axis 为 1 表示垂直分割,与输入数组的维度无关。

案例

对于上述指定 axis=0(默认参数)时的分割效果,可以用 numpy.vsplit 改写如下:

np.vsplit(arr_2, )out:[array([[, ],[, ]]), 
     array([[, ],[, ]]), 
     array([[, ],[, ]])]

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, [[, ]], axis=)out:array([[ ,  ],   [ ,  ],   [ ,  ],   [ ,  ],   [, ],   [, ],   [  ,   ]])

案例

以二维数组为例,对 arr_2 的 axis=1 方向追加数组:

np.append(arr_2, [[], [], [], [], [], []], axis=)out:array([[ ,  ,   ],   [ ,  ,   ],   [ ,  ,   ],   [ ,  ,   ],   [, ,   ],   [, ,   ]])

案例

当不指定 axis 时,在追加动作产生前,会先把输入数组展平:

np.append(arr_2, [[], [], [], [], [], []])out:array([ ,  ,  ,  ,  ,  ,  ,  , , , , ,   , ,   ,   ,   ,   ])

当不指定axis时,append结果为一维数组。

3. 数组的插入

3.1 numpy.insert 函数

numpy.insert 函数沿给定轴和给定索引之前在输入数组中插入值。该函数的原型如下:

numpy.insert(arr, obj, values, axis)

参数说明如下:

参数说明
arr输入数组
obj待插入位置的索引
values待插入的值数组
axis要插入的轴。如果没有指定,则输入数组会先折叠为一维

案例

对于不指定 axis 的情形:

np.insert(arr_2, , [, ])out:array([ ,  , , ,  ,  ,  ,  ,  ,  , , , , ])

可以发现,对于 insert 函数,新插入的元素从指定的位置(索引为2)开始,其他元素往后平移。

案例

指定在 axis=0 的轴上插入新元素:

np.insert(arr_2, , [, ], axis=)out:array([[ ,  ],   [ ,  ],   [, ],   [ ,  ],   [ ,  ],   [, ],   [, ]])

案例

当指定插入的元素跟输入数组形状不一致时,可以通过广播规则进行传播补齐。当不满足广播规则,则会报 ValueError 的错误。

np.insert(arr_2, , [], axis=)out:array([[ ,  ],   [ ,  ],   [, ],   [ ,  ],   [ ,  ],   [, ],   [, ]])

案例

指定在 axis=1 的轴上插入新元素:

np.insert(arr_2, , [, , , , , ], axis=)out:array([[ ,  ,   ],   [ ,  ,   ],   [ ,  ,   ],   [ ,  ,   ],   [, ,   ],   [, ,   ]])

4. 小结

本节讲述了数组分割与追加的常用方法,其中append函数与insert函数在不指定操作轴的时候,函数会首先对输入数组进行展开操作。而hsplit和vsplit则是已经默认了计算方向,使用过程中注意区分。