专栏首页小小挖掘机numpy中的hstack()、vstack()、stack()、concatenate()函数详解

numpy中的hstack()、vstack()、stack()、concatenate()函数详解

本文主要介绍一下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]]

本文分享自微信公众号 - 小小挖掘机(wAIsjwj)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Numpy基础知识点汇总

    1、概述 Numpy是高性能科学计算和数据分析的基础包,它的部分功能如下: 1)ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 ...

    石晓文
  • 盘一盘NumPy (下)

    重塑 (reshape) 和打平 (ravel, flatten) 这两个操作仅仅只改变数组的维度

    石晓文
  • 盘一盘 NumPy (上)

    Numpy 是 Python 专门处理高维数组 (high dimensional array) 的计算的包,每次使用它遇到问题都会它的官网 (www.num...

    石晓文
  • 5个高效&简洁的Numpy函数

    Numpy 允许我们根据给定的新形状重塑矩阵,新形状应该和原形状兼容。有意思的是,我们可以将新形状中的一个参数赋值为-1。这仅仅表明它是一个未知的维度,我们希望...

    昱良
  • 5个优雅的Numpy函数助你走出数据处理困境

    Numpy 允许我们根据给定的新形状重塑矩阵,新形状应该和原形状兼容。有意思的是,我们可以将新形状中的一个参数赋值为-1。这仅仅表明它是一个未知的维度,我们希望...

    小草AI
  • 5个优雅的Numpy函数助你走出数据处理困境

    Numpy 允许我们根据给定的新形状重塑矩阵,新形状应该和原形状兼容。有意思的是,我们可以将新形状中的一个参数赋值为-1。这仅仅表明它是一个未知的维度,我们希望...

    double
  • 数据运算最优雅的5个的Numpy函数

    原文链接:https://towardsdatascience.com/5-smart-python-numpy-functions-dfd1072d2cb4

    猴哥yuri
  • 5个优雅的Numpy函数助你走出数据处理困境

    Numpy 允许我们根据给定的新形状重塑矩阵,新形状应该和原形状兼容。有意思的是,我们可以将新形状中的一个参数赋值为-1。这仅仅表明它是一个未知的维度,我们希望...

    1480
  • 5个优雅的Numpy函数助你走出困境

    本文转自『机器之心编译』(almosthuman2014) 在 reshape 函数中使用参数-1

    统计学家
  • 数据处理遇到麻烦不要慌,5个优雅的Numpy函数助你走出困境

    Numpy 允许我们根据给定的新形状重塑矩阵,新形状应该和原形状兼容。有意思的是,我们可以将新形状中的一个参数赋值为-1。这仅仅表明它是一个未知的维度,我们希望...

    用户2769421

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动