Python–Numpy 数组的拼接合并

发布于 2022-10-06  1345 次阅读


Please refresh the page if equations are not rendered correctly.
---------------------------------------------------------------

** 维度和轴**

在正确理解Numpy中的数组拼接、合并操作之前,有必要认识下维度和轴的概念:ndarray(多维数组)是Numpy处理的数据类型。多维数组的维度即为对应数据所在的空间维度,1维可以理解为直线空间,2维可以理解为平面空间,3维可以理解为立方体空间。

轴是用来对多维数组所在空间进行定义、描述的一组正交化的直线,根据数学惯例可以用i,j,k来表示。
- 在一维空间中,用一个轴就可以表示清楚,numpy中规定为axis 0,空间内的数可以理解为直线空间上的离散点 (x i )。
- 在二维空间中,需要用两个轴表示,numpy中规定为axis 0和axis 1,空间内的数可以理解为平面空间上的离散点(x i,y j)。
- 在三维空间中,需要用三个轴才能表示清楚,在二维空间的基础上numpy中又增加了axis 2,空间内的数可以理解为立方体空间上的离散点(x i,y j,z k)。

Python中可以用numpy中的ndim和shape来分别查看维度,以及在对应维度上的长度。直观上可以根据符号“[ ]”的层数来判断,有m层即为m维,最外面1层对应axis0, 依次为axis1,axis2…

>>> a = np.array([1,2,3])
>>> a.ndim   # 一维数组
1
>>> a.shape   # 在这个维度上的长度为3
(3,)
>>> b = np.array([[1,2,3], [4,5,6]])
>>> b.ndim   # 二维数组
2
>>> b.shape   # 在axis 0 上的长度为2, 在axis 1上的长度为3.或者可以感性的理解为2行3列
(2, 3)
>>> c = np.array([[[1,2,3], [4,5,6]]])
>>> c.ndim   # 三维数组
3
>>> c.shape   
# 在axis 0 上的长度为1,在axis 1上的长度为2, 在axis 2上的长度为3.
(1, 2, 3)

连接数组

函数 描述
concatenate 提供了axis参数,用于指定拼接方向,连接沿现有轴的数组序列
append 默认先ravel再拼接成一维数组,也可指定axis
stack 提供了axis参数,用于生成新的维度,沿着新的轴加入一系列数组
hstack 水平拼接,沿着行的方向,对列进行拼接,水平堆叠序列中的数组(列方向)
vstack 垂直拼接,沿着列的方向,对行进行拼接,竖直堆叠序列中的数组(行方向)
dstack 沿着第三个轴(深度方向)进行拼接
column_stack 水平拼接,沿着行的方向,对列进行拼接
row_stack 垂直拼接,沿着列的方向,对行进行拼接
r_ 垂直拼接,沿着列的方向,对行进行拼接
c_ 水平拼接,沿着行的方向,对列进行拼接

1. numpy.concatenate

numpy.concatenate 函数用于沿指定轴连接相同形状的两个或多个数组,格式如下:

numpy.concatenate((a1, a2, ...), axis)

参数说明:

  • a1, a2, ...:相同类型的数组.采用最简单的list容器放置即可
  • axis:沿着它连接数组的轴,默认为 0.其中axis代表维度方向,默认的axis维度是跟shape的维度(r, c)顺序一致的,也就是说axis=0代表的是第0个维度也就是row方向,axis=1代表的是第1个维度也就是col方向,更高维的情况也类似,只需要基于shape的结果进行理解即可。
  • 函数concatenate()堆叠数组后不会改变维度,只是同维度上堆叠

实例



注意:由于np.concatenate()在堆叠时不会改变数组维度,也就是只能在该数组已有的维度上堆叠,不能在数组已有维度更高的维度堆叠。因此如果传入的是一维数组,则只能堆叠出一维数组。比如传入list包含的数组是[(m,), (n,)],则得到的也是一维的(m+n, ),即axis=0进行堆叠,不能进行axis=1堆叠,因为这种一维数组根本没有axis=1的维度。

2. numpy.stack

numpy.stack 函数用于沿新轴连接数组序列,格式如下:

numpy.stack(arrays, axis)

参数说明:
- arrays相同形状的数组序列,采用list容器放置即可
- axis:返回数组中的轴,输入数组沿着它来堆叠.其中axis代表插入新维度的位置,比如axis=0代表在现有维度id=0的位置插入一个新维度,新维度插入时为1。比如一个array.shape=(2,),插入axis=0的新维度就变成(1,2),插入axis=1的新维度就变成(2,1),而array.shape=(2,3),插入axis=0的新维度就变成(1,2,3),插入axis=1的新维度就变成(2,1,3),插入axis=2的新维度就变成(2,3,1),也就是说插入的新维度大小从0开始,最大新维度位置是现有最大维度数加1.

  • stack()方法跟concatenate()方法最大的不同在于stack方法会先对每个数组在axis指定方向增加一个维度为1,然后再在该新增加的维度方向进行堆叠,因此堆叠后的数组会比源数组高一个维度。 注意:stack()函数这种用axis扩维的方法其实等价于增加np.newaxis

    np.stack的作用是沿新轴加入一系列数组,这句话有两个重点,一是沿新轴,而这个新轴是哪个轴,需要我们自行指定,不指定的话默认是最里边的轴.二是加入数组,所以,运用这个方法的时候,新生成的数组时会比用来进行拼接的原数组多一个维度.

实例


3. numpy.hstack

numpy.hstack 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组。

实例

4. numpy.vstack

numpy.vstack 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组。

实例

5. 单个array的重复堆叠采用np.tile(arr, (m,n))

  • 该方法就是把arr作为一个整体元素,嵌入到(m,n)数组中。因此无论arr是一维还是二维,都是进行简单的堆叠,可以在一个方向上堆叠,也可以在多个方向上同时堆叠。

实例


6. 单个array中每个元素的重复采用np.repeat()

7. np.append()**

append(arr, values, axis=None)
"""
参数说明:
arr:array_like的数据
values: array_like的数据,若axis为None,则先将arr和values进行ravel扁平化,再拼接;否则values应当与arr的shape一致,或至多在拼接axis的方向不一致
axis:进行append操作的axis的方向,默认无

实例

5. column_stack和row_stack

ar1, ar2=np.array([[ 1, 2, 3, 4, 5, 6]]),np.array([[7, 8, 9, 11, 12, 13]] )
>>>np.row_stack((ar1,ar2))
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 11, 12, 13]])
>>>np.column_stack((ar1,ar2))
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 11, 12, 13]])

6. np.r_ 和np.c_

ar1, ar2=np.array([[ 1, 2, 3, 4, 5, 6]]),np.array([[7, 8, 9, 11, 12, 13]] )
>>> np.r_[ar1,ar2]   # 垂直拼接,沿着列的方向,对行进行拼接
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 11, 12, 13]])
>>> np.c_[ar1,ar2]  # 水平拼接,沿着行的方向,对列进行拼接
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 11, 12, 13]])

** 总结 **

对于两个shape一样的二维array来说,增加行(对行进行拼接)的方法有:

np.concatenate((ar1, ar2),axis=0)
np.append(ar1, ar2, axis=0)
np.vstack((ar1,ar2))
np.row_stack((ar1,ar2))
np.r_[ar1,ar2]

增加列(对列进行拼接)的方法有:

np.concatenate((ar1, ar2),axis=1)
np.append(ar1, ar2, axis=1)
np.hstack((ar1,ar2))
np.column_stack((ar1,ar2))
np.c_[ar1,ar2]
Everything not saved will be lost.
最后更新于 2022-10-06