改变数据形态

改变数据形态

作者: 莫烦 编辑: 莫烦 发布于: 2021-09-19

我们在 Array维度 的教学中,已经得知 Numpy 最核心的一种能力就是处理多维数据。 但是在那一节内容中,我们还没提到多维数据的一些处理方式。因为在数据分析,特别是机器学习中,数据的形态转变十分频繁。 今天我们就来看看如何做数据的变换吧。

本节内容要囊括的功能:

  • 改变形态
    • array[np.newaxis, :]
    • array.reshape()
    • array.ravel(), array.flatten()
    • array.transpose()
  • 合并
    • np.column_stack(), np.row_stack()
    • np.vstack(), np.hstack(), np.stack()
    • np.concatenate()
  • 拆解
    • np.vsplit(), np.hsplit(), np.split()

改变形态

改变形态,其实是针对与多维度空间上的数据,要改变它的维度信息,和每个维度中的数据格式。所以第一点你就要清楚,如何添加维度。 其实在 多维数据教程中 中我们就提到过添加维度的方法,我这里在总结括展一下。

我再来讲讲,除了这种方式的其它几种,能达到同样效果的方式。比如用 None 或者 np.expand_dims(),

除了添加维度,我们还能减少维度,但是下面介绍的减少维度,只能减少那些维度 shape 上为 1 的维度。因为减掉这个维度,数据结构上是没有变化的。

上述方法都是添加维度的方式,但是,在机器学习中,我们还有一个更常见的操作,是要改变 shape。维度的添加减少,只能添加减少一个维度,数据结构是不变的。 但是 np.reshape() 可以改变数据结构。 举个例子,a[None, :] 之后,a.shape 会在第一个维度上多一个 1,而 a.reshape([2,3]) 则可以更加自定义的将维度内的个数进行修改。 从而达到改变维度及尺寸。

举个例子,学生军训的时候,我想让他们战队,可以站成一排,可以分几排站。其实学生都没有变化,只是战队的方式变了,这时候,reshape 就能帮我们干这件事。

其实还有更多的改变形态的方法,比如让数据变直展平np.ravel(), np.flatten(),这两个比较特殊, 我会在 对速度有洁癖 这节的时候详细说明。

而在矩阵运算的时候,也有一种形态的转化,叫做矩阵转置,np.transpose(), 在机器学习中也用得很多。这里提一下, 给一个小案例,你们玩玩试试。

合并

在介绍多维数组的时候, 我们也稍微介绍了一下如何添加合并数组。现在我们再详细把数组的合并拆解都细说一下。

一般来说,在数据分析统计,机器学习中的数据,都是以二维来存储的。行是数据样本(第一维度),列是特征(第二维度)。 所以我们可以组合特征和组合样本。 比如将列column合并,特征 a 的数据和特征 b 的数据合并。

一条条的数据 sample 和并。

上面的两种方法 np.column_stack()np.row_stack() 和后面的 np.vstack()np.hstack() 相比, 有些特殊之处,我们先看看使用 vstackhstack 的案例,再说说不同处吧。

看到了吗?用 column_stackrow_stack() 的时候,Numpy 自动帮你处理的维度信息,而用 vstackhstack 的时候,你需要先确保维度信息是正确的,然后再合并。

有时候,你想要用统一的方法来处理各种不同情况的合并,np.concatenate() 是我最喜欢的方法,管它什么 vstack hstack 甚至是在更高维度上要合并, 我们都可以用 concatenate() 一个功能实现。

拆解

同样,能横着,竖着合并,那也能横着竖着拆解。np.vsplit()np.hsplit() 就是干这事的。 如果直接在 indices_or_sections 后填入数字,就是要整分的段数, 而如果接着的是一个列表,那就按照列表中的 index 来取区间。可以看看下面代码注解中的意思。(下面的数据量会相对较多, 如果你喜欢用生成数据的方式练习,可以先看看这一节数据生成内容。)

np.vsplit 是拿着刀沿着横向切分,那么 np.hsplit 就是沿纵向切分,我就不再举例了。那么有没有既能横切也能纵切的函数呢? 当然有呀,和 stack 一样,如果直接用 np.split() 你就能选择要切分的维度来自定义切分了。

总结

形态变化和合并拆解都是十分有用的功能,我们介绍了很多种实用的方法来完成这些事, 而懂了这些之后,你的数据分析和机器学习才算是真正迈入入圈的第一步。


降低知识传递的门槛

莫烦经常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛免费 奉献我的所学正是受这种态度的影响。 【支持莫烦】 能让我感到认同,我也更有理由坚持下去。

我组建了微信群,欢迎大家加入,交流经验,提出问题,互相帮持。 扫码后,请一定备注"莫烦",否则我不会同意你的入群申请。

wechat

    Numpy 数据怪兽