详解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统计列表中的重复项出现的次数的方法
Aug 18 Python
python显示生日是星期几的方法
May 27 Python
一波神奇的Python语句、函数与方法的使用技巧总结
Dec 08 Python
Python中的字符串查找操作方法总结
Jun 27 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
python3模块smtplib实现发送邮件功能
May 22 Python
Python之循环结构
Jan 15 Python
python实现动态数组的示例代码
Jul 15 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 Python
Python 必须了解的5种高级特征
Sep 10 Python
python list的index()和find()的实现
Nov 16 Python
Python 数据可视化之Matplotlib详解
Nov 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缩略图生成程式(需要GD库支持)
2007/03/06 PHP
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
python访问系统环境变量的方法
2015/04/29 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
python删除某个字符
2018/03/19 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
Python @property使用方法解析
2019/09/17 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
python 实现性别识别
2020/11/21 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
矫正人员思想汇报
2014/01/08 职场文书
升国旗演讲稿
2014/09/05 职场文书
2015元旦标语横幅
2014/12/09 职场文书
消防演习感想
2015/08/10 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
Python数据结构之队列详解
2022/03/21 Python