详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)


Posted in Python onMay 27, 2019

Numpy中提供了concatenate,append, stack类(包括hsatck、vstack、dstack、row_stack、column_stack),r_和c_等类和函数用于数组拼接的操作。

各种函数的特点和区别如下标:

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

0. 维度和轴

在正确理解Numpy中的数组拼接、合并操作之前,有必要认识下维度和轴的概念:

ndarray(多维数组)是Numpy处理的数据类型。多维数组的维度即为对应数据所在的空间维度,1维可以理解为直线空间,2维可以理解为平面空间,3维可以理解为立方体空间。

详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)

轴是用来对多维数组所在空间进行定义、描述的一组正交化的直线,根据数学惯例可以用i,j,ki, j ,ki,j,k来表示。

在一维空间中,用一个轴就可以表示清楚,numpy中规定为axis 0,空间内的数可以理解为直线空间上的离散点 (x iii, )。

在二维空间中,需要用两个轴表示,numpy中规定为axis 0和axis 1,空间内的数可以理解为平面空间上的离散点(x iii,y jjj)。

在三维空间中,需要用三个轴才能表示清楚,在二维空间的基础上numpy中又增加了axis 2,空间内的数可以理解为立方体空间上的离散点(x iii,y jjj,z kkk)。

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列
(1, 2, 3)

1. np.concatenate()

concatenate(a_tuple, axis=0, out=None)
"""
参数说明:
a_tuple:对需要合并的数组用元组的形式给出
axis: 沿指定的轴进行拼接,默认0,即第一个轴
"""

示例

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

>>> np.concatenate((ar1, ar2))  # 这里的第一轴(axis 0)是行方向
array([[ 1, 2, 3],
    [ 4, 5, 6],
    [ 7, 8, 9],
    [11, 12, 13]])

>>> np.concatenate((ar1, ar2),axis=1)  # 这里沿第二个轴,即列方向进行拼接
array([[ 1, 2, 3, 7, 8, 9],
    [ 4, 5, 6, 11, 12, 13]])

>>> ar3 = np.array([[14,15,16]]) # shape为(1,3)的2维数组
>>> np.concatenate((ar1, ar3))  # 一般进行concatenate操作的array的shape需要一致,当然如果array在拼接axis方向的size不一样,也可以完成
>>> np.concatenate((ar1, ar3)) # ar3虽然在axis0方向的长度不一致,但axis1方向上一致,所以沿axis0可以拼接
array([[ 1, 2, 3],
    [ 4, 5, 6],
    [14, 15, 16]])
>>> np.concatenate((ar1, ar3), axis=1)  # ar3和ar1在axis0方向的长度不一致,所以报错

2. pd.append()

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

示例

>>> np.append(ar1, ar2)  # 先ravel扁平化再拼接,所以返回值为一个1维数组
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13])

>>> np.append(ar1, ar2, axis=0)   # 沿第一个轴拼接,这里为行的方向 
array([[ 1, 2, 3],
    [ 4, 5, 6],
    [ 7, 8, 9],
    [11, 12, 13]])

>>> np.append(ar1, ar2, axis=1)   # 沿第二个轴拼接,这里为列的方向 
array([[ 1, 2, 3, 7, 8, 9],
    [ 4, 5, 6, 11, 12, 13]])

3. np.stack()

stack(arrays, axis=0, out=None)
"""
沿着指定的axis对arrays(每个array的shape必须一样)进行拼接,返回值的维度比原arrays的维度高1
axis:默认为0,即第一个轴,若为-1即为第二个轴
"""

示例

>>> np.stack((ar1, ar2))   # 增加第一个维度(axis0,之后的axis向后顺延:0—>1, 1—>2)
array([[[ 1, 2, 3],
    [ 4, 5, 6]],
    [[ 7, 8, 9],
    [11, 12, 13]]])

>>> np.stack((ar1, ar2), axis=1)   # 增加第二个维度(axis1,之后的axis向后顺延, 1—>2)
array([[[ 1, 2, 3],
    [ 7, 8, 9]],
    [[ 4, 5, 6],
    [11, 12, 13]]])

>>> np.stack((ar1, ar2), axis=2)   # 增加第三个维度(axis2,和axis=-1的效果一样,原来的axis0和axis1保持不变)
array([[[ 1, 7],
    [ 2, 8],
    [ 3, 9]],
    [[ 4, 11],
    [ 5, 12],
    [ 6, 13]]])

关于维度增加的一种理解方式

详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)

4. hstack、vstack和vstack

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

>>> np.vstack((ar1,ar2))  # 垂直拼接,沿着列的方向,对行进行拼接
array([[ 1, 2, 3],
    [ 4, 5, 6],
    [ 7, 8, 9],
    [11, 12, 13]])
    
>>> np.dstack((ar1,ar2))  # 对于2维数组来说,沿着第三轴(深度方向)进行拼接, 效果相当于stack(axis=-1)
array([[[ 1, 7],
    [ 2, 8],
    [ 3, 9]],
    [[ 4, 11],
    [ 5, 12],
    [ 6, 13]]])

5. column_stack和row_stack

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

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

6. np.r_ 和np.c_

常用于快速生成ndarray数据

>>> 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, 7, 8, 9],
    [ 4, 5, 6, 11, 12, 13]])

7. 总结

对于两个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]

相关代码可见:https://github.com/guofei1989/python_func_cases/tree/master/numpy_demos

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现年会抽奖程序
Jan 22 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
pytorch方法测试详解——归一化(BatchNorm2d)
Jan 15 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
jupyter 实现notebook中显示完整的行和列
Apr 09 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
python中pathlib模块的基本用法与总结
Aug 17 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 Python
Python读写Excel表格的方法
Mar 02 Python
python安装numpy和pandas的方法步骤
May 27 #Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
May 27 #Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 #Python
Python3.7 新特性之dataclass装饰器
May 27 #Python
Python3多目标赋值及共享引用注意事项
May 27 #Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 #Python
python占位符输入方式实例
May 27 #Python
You might like
PHP经典面试题集锦
2015/03/19 PHP
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
python中列表元素连接方法join用法实例
2015/04/07 Python
python自定义类并使用的方法
2015/05/07 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
年终考核评语
2014/01/19 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
小学体育教学随笔
2015/08/14 职场文书
多人股份制合作协议书
2016/03/19 职场文书
详解Laravel服务容器的优势
2021/05/29 PHP
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android