添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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]