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]
Comments NOTHING