前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 3-6 Numpy数组(和矩阵)的合并与分割

机器学习入门 3-6 Numpy数组(和矩阵)的合并与分割

作者头像
触摸壹缕阳光
发布2022-05-25 14:01:14
6850
发布2022-05-25 14:01:14
举报

数组的合并

在 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 函数实现数组的合并操作。合并多个一维数组:

代码语言: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]])
'''

多维数组拥有多个维度,在不同维度上的合并操作会得到不同的合并结果。在 concatenate 函数中,我们可以指定 axis 值来决定合并的维度。

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

待合并的数组必须拥有相同的维度,如果不同维度则会抛出 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)
'''

我们在实际开发中,比较常用的操作就是对二维或者三维数组进行行和列的合并操作,所以 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]])
'''

数组的分割

首先创建一个一维数组:

代码语言:javascript
复制
x = np.arange(10)

print(x)
'''
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
'''

数组的分割使用 split 函数,split 有两个参数:

  • 第一个参数为待分割的数组对象
  • 第二个参数是一个列表,列表中的值是指定的分割点
代码语言:javascript
复制
x1, x2, x3 = np.split(x, [3, 7])

print(x1)
'''
array([0, 1, 2])
'''

print(x2)
'''
array([3, 4, 5, 6])
'''

print(x3)
'''
array([7, 8, 9])
'''

split 函数的第二个参数传入 [3, 7],将一维数组分成了三段:

  • 第一段为 x[: 3]
  • 第二段为 x[3: 7]
  • 第三段为 x[7: ]

如果需要将数组分成两段,则只需要指定一个分割点。

代码语言:javascript
复制
x1, x2 = np.split(x, [4])

print(x1)
'''
array([0, 1, 2, 3])
'''

print(x2)
'''
array([4, 5, 6, 7, 8, 9])
'''

split 函数的第二个参数传入 [4],将一维数组分成了两段:

  • 第一段为 x[: 4]
  • 第二段为 x[4: ]

不过需要注意,即使需要指定一个分割点,也需要传入一个列表。

split 函数同样可以应用到二维数组中,创建一个形状为 (4, 4) 的二维数组。

代码语言:javascript
复制
A = np.arange(16).reshape((4, 4))

print(A)
'''
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
'''
代码语言:javascript
复制
A1, A2 = np.split(A, [2])

print(A1)
'''
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
'''

print(A2)
'''
array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])
'''

数组的分割操作和合并操作一样,当处理高维数组时,可以指定 axis 参数来决定对高维数组的哪个维度进行分割或合并。split 函数中的 axis 参数同样默认为 0,即默认按行进行分割。如果相对列进行分割只需要将 axis 设置为 1。

代码语言:javascript
复制
A1, A2 = np.split(A, [2], axis = 1)

print(A1)
'''
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]])
'''

print(A2)
'''
array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])
'''

和合并操作一样,我们经常对二维或三维数据进行行和列的分割操作,所以 NumPy 为我们提供了更为方便的 vsplit 和 hsplit。

vsplit 沿着行进行分割。

代码语言:javascript
复制
upper, lower = np.vsplit(A, [2])

print(upper)
'''
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
'''

print(lower)
'''
array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])
'''

hsplit 沿着列进行分割。

代码语言:javascript
复制
left, right = np.hsplit(A, [2])

print(left)
'''
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]])
'''

print(right)
'''
array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])
'''

数组分割的意义

现在有一个形状为 (4, 4) 的二维数组,如果这个二维数组被当做机器学习的数据集,通常会表示为拥有 4 个样本,每个样本拥有 3 个不同的特征(前三列),最后一列为每一个样本对应的目标值(可能是个类别标签,也可能是一个具体的实数值)。

代码语言:javascript
复制
data = np.arange(16).reshape((4, 4))

print(data)
'''
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
'''

拿到这种样式的机器学习数据集时,我们需要将其分割成特征和目标值两个部分,这时就可以使用 hsplit 函数。

代码语言:javascript
复制
X, y = np.hsplit(data, [-1])

print(X)
'''
array([[ 0,  1,  2],
       [ 4,  5,  6],
       [ 8,  9, 10],
       [12, 13, 14]])
'''

print(y)
'''
array([[ 3],
       [ 7],
       [11],
       [15]])
'''

有时,为了方便后续的处理,我们需要将目标值 y 转换为一维数组。

代码语言:javascript
复制
print(y[:, 0])
'''
array([ 3,  7, 11, 15])
'''

References:

  1. Python3入门机器学习 经典算法与应用: https://coding.imooc.com/class/chapter/169.html#Anchor
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数组的合并
  • 数组的分割
  • 数组分割的意义
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档