经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » NumPy » 查看文章
numpy中hstack vstack stack concatenate函数示例详解
来源:jb51  时间:2023/2/24 9:06:42  对本文有异议

大纲

本文主要介绍一下numpy中的几个常用函数,包括hstack()、vstack()、stack()、concatenate()。

1、concatenate()

我们先来介绍最全能的concatenate()函数,后面的几个函数其实都可以用concatenate()函数来进行等价操作。

concatenate()函数根据指定的维度,对一个元组、列表中的list或者ndarray进行连接,函数原型:

  1. numpy.concatenate((a1, a2, ...), axis=0)

先来看几个例子,一个2*2的数组和一个1*2的数组,在第0维进行拼接,得到一个3*2的数组:

  1. a = np.array([[1, 2], [3, 4]])
  2. b = np.array([[5, 6]])
  3. np.concatenate((a, b), axis=0)

输出为:

  1. array([[1, 2],
  2. ? ? ? [3, 4],
  3. ? ? ? [5, 6]])

进一步,一个2*2的数组和一个2*1的数组,在第01维进行拼接,得到一个2*3的数组:

  1. np.concatenate((a, b.T), axis=1)

输出为:

  1. array([[1, 2, 5],
  2. ? ? ? [3, 4, 6]])

上面两个简单的例子中,拼接的维度的长度是不同的,但是其他维度的长度必须是相同的,这也是使用concatenate()函数的一个基本原则,违背此规则就会报错,例如一个2*2的数组和一个1*2的数组,在第1维进行拼接:

  1. np.concatenate((a, b), axis=1)

上面的代码会报错:

  1. ValueError: all the input array dimensions except for the concatenation axis must match exactly

2、stack()

stack()函数的原型是numpy.stack(arrays, axis=0),即将一堆数组的数据按照指定的维度进行堆叠。
我们先看两个简单的例子:

  1. a = np.array([1,2,3])
  2. b = np.array([2,3,4])
  3. np.stack([a,b],axis=0)

输出为:

  1. array([[1, 2, 3],
  2. ? ? ? [2, 3, 4]])

进一步:

  1. np.stack([a,b],axis=1)

输出为:

  1. array([[1, 2],
  2. ? ? ? [2, 3],
  3. ? ? ? [3, 4]])

如果换作是二维数组:

  1. a = np.array([[1,2,3]])
  2. b = np.array([[2,3,4]])
  3. np.stack([a,b],axis=0)

输出为:

  1. array([[[1, 2, 3]],
  2. ? ? ? [[2, 3, 4]]])

可以看到,进行stack的两个数组必须有相同的形状,同时,输出的结果的维度是比输入的数组都要多一维的。我们拿第一个例子来举例,两个含3个数的一维数组在第0维进行堆叠,其过程等价于先给两个数组增加一个第0维,变为1*3的数组,再在第0维进行concatenate()操作:

  1. a = np.array([1,2,3])
  2. b = np.array([2,3,4])
  3. a = a[np.newaxis,:]
  4. b = b[np.newaxis,:]
  5. np.concatenate([a,b],axis=0)

输出为:

  1. array([[1, 2, 3],
  2. ? ? ? [2, 3, 4]])

3、vstack()

vstack()的函数原型:vstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。它是垂直(按照行顺序)的把数组给堆叠起来。
举两个简单的例子:

  1. a = np.array([1,2,3])
  2. b = np.array([2,3,4])
  3. np.vstack([a,b])

输出为:

  1. array([[1, 2, 3],
  2. ? ? ? [2, 3, 4]])

进一步:

  1. a=[[1],[2],[3]]
  2. b=[[1],[2],[3]]
  3. np.vstack([a,b])

输出为:

  1. array([[1],
  2. ? ? ? [2],
  3. ? ? ? [3],
  4. ? ? ? [1],
  5. ? ? ? [2],
  6. ? ? ? [3]])

如果进行vstack的数组至少有两维,那么相当于np.concatenate([a,b],axis=0),我们通过例子进行对比:

  1. a=[[1],[2],[3]]
  2. b=[[1],[2],[3]]
  3. np.concatenate([a,b],axis=0)

输出为:

  1. array([[1],
  2. ? ? ? [2],
  3. ? ? ? [3],
  4. ? ? ? [1],
  5. ? ? ? [2],
  6. ? ? ? [3]])

可以看到,跟刚才的结果是一致的,但是如果进行堆叠的两个数组只有一维,那么结果是不同的:

  1. a = np.array([1,2,3])
  2. b = np.array([2,3,4])
  3. np.concatenate([a,b],axis=0)

上面得到的结果为:

  1. array([1, 2, 3, 2, 3, 4])

4、hstack()

hstack()的函数原型:hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。它其实就是水平(按列顺序)把数组给堆叠起来,与vstack()函数正好相反。举几个简单的例子:

  1. a = np.array([1,2,3])
  2. b = np.array([2,3,4])
  3. np.hstack([a,b])

输出为:

  1. array([1, 2, 3, 2, 3, 4])

进一步,对于二维数组的情形:

  1. a=[[1],[2],[3]]
  2. b=[[1],[2],[3]]
  3. np.hstack([a,b])

输出为:

  1. array([[1, 1],
  2. ? ? ? [2, 2],
  3. ? ? ? [3, 3]])

如果进行hstack的数组至少有两维,那么相当于np.concatenate([a,b],axis=1)

  1. a=[[1],[2],[3]]
  2. b=[[1],[2],[3]]
  3. np.concatenate([a,b],axis=1)

输出跟刚才的结果是一致的

  1. array([[1, 1],
  2. ? ? ? [2, 2],
  3. ? ? ? [3, 3]])

只有一维的情况下,并不等价于np.concatenate([a,b],axis=1),反而等价于np.concatenate([a,b],axis=0)。

5、tf中的stack()

tensorflow中也提供了stack函数,跟numpy中的stack函数的作用是一样的,我们通过例子来体会:

  1. import tensorflow as tf
  2. a = tf.convert_to_tensor([1,2,3])
  3. b = tf.convert_to_tensor([2,3,4])
  4. stack_ab = tf.stack([a,b])
  5. a1 = tf.expand_dims(a,axis=0)
  6. b1 = tf.expand_dims(b,axis=0)
  7. concat_ab = tf.concat([a1,b1],axis=0)
  8. with tf.Session() as sess:
  9. ? ?print(sess.run(stack_ab))
  10. ? ?print(sess.run(concat_ab))

输出为:

  1. [[1 2 3]
  2. [2 3 4]]
  3. [[1 2 3]
  4. [2 3 4]]

以上就是numpy中hstack vstack stack concatenate函数示例详解的详细内容,更多关于numpy函数示例的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号