搜索

查看: 3084|回复: 11

[Python] numpy中hstack vstack stack concatenate函数示例详解

[复制链接]
发表于 2023-5-4 17:17:54 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:17:54 3084 11 看全部
目录
  • 大纲
  • 1、concatenate()
  • 2、stack()
  • 3、vstack()
  • 4、hstack()
  • 5、tf中的stack()
    大纲
    本文主要介绍一下numpy中的几个常用函数,包括hstack()、vstack()、stack()、concatenate()。

    1、concatenate()
    我们先来介绍最全能的concatenate()函数,后面的几个函数其实都可以用concatenate()函数来进行等价操作。
    concatenate()函数根据指定的维度,对一个元组、列表中的list或者ndarray进行连接,函数原型:
    numpy.concatenate((a1, a2, ...), axis=0)
    先来看几个例子,一个2*2的数组和一个1*2的数组,在第0维进行拼接,得到一个3*2的数组:
    a = np.array([[1, 2], [3, 4]])
    b = np.array([[5, 6]])
    np.concatenate((a, b), axis=0)
    输出为:
    array([[1, 2],
           [3, 4],
           [5, 6]])
    进一步,一个2*2的数组和一个2*1的数组,在第01维进行拼接,得到一个2*3的数组:
    np.concatenate((a, b.T), axis=1)
    输出为:
    array([[1, 2, 5],
           [3, 4, 6]])
    上面两个简单的例子中,拼接的维度的长度是不同的,但是其他维度的长度必须是相同的,这也是使用concatenate()函数的一个基本原则,违背此规则就会报错,例如一个2*2的数组和一个1*2的数组,在第1维进行拼接:
    np.concatenate((a, b), axis=1)
    上面的代码会报错:
    ValueError: all the input array dimensions except for the concatenation axis must match exactly

    2、stack()
    stack()函数的原型是numpy.stack(arrays, axis=0),即将一堆数组的数据按照指定的维度进行堆叠。
    我们先看两个简单的例子:
    a = np.array([1,2,3])
    b = np.array([2,3,4])
    np.stack([a,b],axis=0)
    输出为:
    array([[1, 2, 3],
           [2, 3, 4]])
    进一步:
    np.stack([a,b],axis=1)
    输出为:
    array([[1, 2],
           [2, 3],
           [3, 4]])
    如果换作是二维数组:
    a = np.array([[1,2,3]])
    b = np.array([[2,3,4]])
    np.stack([a,b],axis=0)
    输出为:
    array([[[1, 2, 3]],
           [[2, 3, 4]]])
    可以看到,进行stack的两个数组必须有相同的形状,同时,输出的结果的维度是比输入的数组都要多一维的。我们拿第一个例子来举例,两个含3个数的一维数组在第0维进行堆叠,其过程等价于先给两个数组增加一个第0维,变为1*3的数组,再在第0维进行concatenate()操作:
    a = np.array([1,2,3])
    b = np.array([2,3,4])
    a = a[np.newaxis,:]
    b = b[np.newaxis,:]
    np.concatenate([a,b],axis=0)
    输出为:
    array([[1, 2, 3],
           [2, 3, 4]])

    3、vstack()
    vstack()的函数原型:vstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。它是垂直(按照行顺序)的把数组给堆叠起来。
    举两个简单的例子:
    a = np.array([1,2,3])
    b = np.array([2,3,4])
    np.vstack([a,b])
    输出为:
    array([[1, 2, 3],
           [2, 3, 4]])
    进一步:
    a=[[1],[2],[3]]
    b=[[1],[2],[3]]
    np.vstack([a,b])
    输出为:
    array([[1],
           [2],
           [3],
           [1],
           [2],
           [3]])
    如果进行vstack的数组至少有两维,那么相当于np.concatenate([a,b],axis=0),我们通过例子进行对比:
    a=[[1],[2],[3]]
    b=[[1],[2],[3]]
    np.concatenate([a,b],axis=0)
    输出为:
    array([[1],
           [2],
           [3],
           [1],
           [2],
           [3]])
    可以看到,跟刚才的结果是一致的,但是如果进行堆叠的两个数组只有一维,那么结果是不同的:
    a = np.array([1,2,3])
    b = np.array([2,3,4])
    np.concatenate([a,b],axis=0)
    上面得到的结果为:
    array([1, 2, 3, 2, 3, 4])

    4、hstack()
    hstack()的函数原型:hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。它其实就是水平(按列顺序)把数组给堆叠起来,与vstack()函数正好相反。举几个简单的例子:
    a = np.array([1,2,3])
    b = np.array([2,3,4])
    np.hstack([a,b])
    输出为:
    array([1, 2, 3, 2, 3, 4])
    进一步,对于二维数组的情形:
    a=[[1],[2],[3]]
    b=[[1],[2],[3]]
    np.hstack([a,b])
    输出为:
    array([[1, 1],
           [2, 2],
           [3, 3]])
    如果进行hstack的数组至少有两维,那么相当于np.concatenate([a,b],axis=1)
    a=[[1],[2],[3]]
    b=[[1],[2],[3]]
    np.concatenate([a,b],axis=1)
    输出跟刚才的结果是一致的
    array([[1, 1],
           [2, 2],
           [3, 3]])
    只有一维的情况下,并不等价于np.concatenate([a,b],axis=1),反而等价于np.concatenate([a,b],axis=0)。

    5、tf中的stack()
    tensorflow中也提供了stack函数,跟numpy中的stack函数的作用是一样的,我们通过例子来体会:
    import tensorflow as tf
    a = tf.convert_to_tensor([1,2,3])
    b = tf.convert_to_tensor([2,3,4])
    stack_ab = tf.stack([a,b])
    a1 = tf.expand_dims(a,axis=0)
    b1 = tf.expand_dims(b,axis=0)
    concat_ab = tf.concat([a1,b1],axis=0)
    with tf.Session() as sess:
        print(sess.run(stack_ab))
        print(sess.run(concat_ab))
    输出为:
    [[1 2 3]
    [2 3 4]]
    [[1 2 3]
    [2 3 4]]
    以上就是numpy中hstack vstack stack concatenate函数示例详解的详细内容,更多关于numpy函数示例的资料请关注知鸟论坛其它相关文章!
  • 回复

    使用道具 举报

    发表于 2023-6-28 19:30:07 | 显示全部楼层
    落败的青春阳落s 2023-6-28 19:30:07 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 15:12:38 | 显示全部楼层
    素色流年783 2023-6-29 15:12:38 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 18:37:47 | 显示全部楼层
    哈哈SE7 2023-6-29 18:37:47 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-29 19:44:09 | 显示全部楼层
    123456848 2023-6-29 19:44:09 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 02:46:33 | 显示全部楼层
    123456809 2023-6-30 02:46:33 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 08:25:18 | 显示全部楼层
    知足常乐77 2023-6-30 08:25:18 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-30 13:47:51 | 显示全部楼层
    六翼天使494 2023-6-30 13:47:51 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-7-1 01:16:03 | 显示全部楼层
    米老鼠和蓝精鼠v 2023-7-1 01:16:03 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-3 07:41:49 | 显示全部楼层
    风来时狂放 2023-7-3 07:41:49 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表