前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三个NumPy数组合并函数的使用

三个NumPy数组合并函数的使用

作者头像
触摸壹缕阳光
发布2022-05-25 14:00:26
1.8K0
发布2022-05-25 14:00:26
举报

在 numpy 中合并数组比较常用的方法有 concatenate、vstack 和 hstack。在介绍这三个方法之前,首先创建几个不同维度的数组:

代码语言:javascript
复制
import numpy as np

# 创建一维数组
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
z = np.array([666, 666, 666])

# 创建二维数组
A = np.array([[1, 2, 3], 
             [4, 5, 6]])
B = np.array([[100, 200, 300], 
             [400, 500, 600]])

concatenate

numpy.concatenate((a1, a2, ...), axis = 0) 其中:

  • a1, a2,....: 待合并的数组
  • axis: 沿着数组合并的维度,默认为 0(对于二维数组来说,默认沿着行的方向进行合并)

这里需要注意 a1, a2,... 待合并的数组除了待合并的维度,其余维度上的值必须相等。二维数组(矩阵)有两个 axis,一个 axis = 0(行方向),一个 axis = 1(列方向),如果是多维数组依次类推。比如:

  • 形状为 (2, 3) 和 (1, 3) 的两个二维数组可以沿着 axis = 0 的方向进行合并,合并的结果为 (3, 3);
  • 形状为 (2, 3) 和 (2, 3) 的两个二维数组既可以沿着 axis = 0 的方向也可以沿着 axis = 1 的方向合并;
  • 形状为 (2, 1) 和 (1, 3) 的两个二维数组既不可以沿着 axis = 0 的方向也可以沿着 axis = 1 的方向合并;

合并多个一维数组:

代码语言:javascript
复制
print(np.concatenate((x, y)))
'''
array([1, 2, 3, 3, 2, 1])
'''

print(np.concatenate((x, y, z)))
'''
array([  1,   2,   3,   3,   2,   1, 666, 666, 666])
'''

合并多个二维数组:

代码语言:javascript
复制
print(np.concatenate((A, B), axis = 0))
'''
array([[  1,   2,   3],
       [  4,   5,   6],
       [100, 200, 300],
       [400, 500, 600]])
'''

axis = 0,即沿着行方向进行合并。这种合并二维数组的场景非常多,比如对于输入特征为二维数组的情况下,需要补充新的样本,可以将二维数组沿着行方向进行合并,有时会将行称为样本维度。

代码语言:javascript
复制
print(np.concatenate((A, B), axis = 1))
'''
array([[  1,   2,   3, 100, 200, 300],
       [  4,   5,   6, 400, 500, 600]])
'''

axis = 1,即沿着列方向进行合并。比如对于输入特征为二维数组的情况下,需要为输入补充一些新的特征,可以将二维数组沿着列方向进行合并,有时会将列称为特征维度。

待合并的数组必须拥有相同的维度,如果不同维度则会抛出 ValueError 异常。

代码语言:javascript
复制
print(np.concatenate([A, z]))
'''
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)
'''

这是因为 A 的形状为 (2, 3),而 z 的形状为 (3,),如果想要让两个数组进行合并,可以将 z 的形状转换为 (1, 3),这样我们就可以沿着 axis = 0 的方向进行合并。

代码语言:javascript
复制
print(np.concatenate([A, z.reshape(1, -1)]))
'''
array([[  1,   2,   3],
       [  4,   5,   6],
       [666, 666, 666]])
'''

需要注意拼接后的结果是一个新的数组。

vstack 和 hstack

我们在实际开发中,比较常用的操作就是对二维或者三维数组进行行和列的合并操作,所以 numpy 为我们提供了更加方便的 vstack 和 hstack。vstack 将数组沿着行的方向进行合并操作,而 hstack 将数组沿着列的方向进行合并操作。

代码语言:javascript
复制
print(np.vstack((A, B)))
'''
array([[  1,   2,   3],
       [  4,   5,   6],
       [100, 200, 300],
       [400, 500, 600]])
'''

print(np.hstack((A, B)))
'''
array([[  1,   2,   3, 100, 200, 300],
       [  4,   5,   6, 400, 500, 600]])
'''

上面的操作我们同样可以使用 concatenate 实现,换句话说 vstack 和 hstack 是 concatenate 更为具体的操作。

不过需要注意,当处理一维数组时:

  • vstack 会把形状为 (N, ) 的一维数组转换为 (1, N) 的二维数组,然后进行后续的合并操作
  • hstack 的处理方式和 concatenate 一样,二维数组和一维数组合并会抛出ValueError 异常,而两个一维数组合并会合并成新的一维数组,比如合并形状分别为 (3, ) 和 (2, ) 的两个一维数组,合并的结果为形状为 (5, ) 的一维数组。
代码语言:javascript
复制
print(np.vstack((x,y)))
'''
array([[1, 2, 3],
       [3, 2, 1]])
'''

print(np.vstack((A, z)))
'''
array([[  1,   2,   3],
       [  4,   5,   6],
       [666, 666, 666]])
'''

使用 vstack 沿着行方向合并 A 和 z 两个数组,没有抛出异常,这是因为 vstack 会将一维数组转换为二维数组。

针对一维数组,hstack 的处理方式和 concatenate 一样。

代码语言:javascript
复制
print(np.hstack((x, y)))
'''
array([1, 2, 3, 3, 2, 1])
'''

print(np.hstack((A, z)))
'''
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)
'''
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • concatenate
  • vstack 和 hstack
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档