改变数据形态
我们在 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()
相比, 有些特殊之处,我们先看看使用 vstack
和 hstack
的案例,再说说不同处吧。
看到了吗?用 column_stack
和 row_stack()
的时候,Numpy 自动帮你处理的维度信息,而用 vstack
和 hstack
的时候,你需要先确保维度信息是正确的,然后再合并。
有时候,你想要用统一的方法来处理各种不同情况的合并,np.concatenate()
是我最喜欢的方法,管它什么 vstack
hstack
甚至是在更高维度上要合并, 我们都可以用 concatenate()
一个功能实现。
拆解¶
同样,能横着,竖着合并,那也能横着竖着拆解。np.vsplit()
和 np.hsplit()
就是干这事的。 如果直接在 indices_or_sections
后填入数字,就是要整分的段数, 而如果接着的是一个列表,那就按照列表中的 index 来取区间。可以看看下面代码注解中的意思。(下面的数据量会相对较多, 如果你喜欢用生成数据的方式练习,可以先看看这一节数据生成内容。)
np.vsplit
是拿着刀沿着横向切分,那么 np.hsplit
就是沿纵向切分,我就不再举例了。那么有没有既能横切也能纵切的函数呢? 当然有呀,和 stack
一样,如果直接用 np.split()
你就能选择要切分的维度来自定义切分了。
总结¶
形态变化和合并拆解都是十分有用的功能,我们介绍了很多种实用的方法来完成这些事, 而懂了这些之后,你的数据分析和机器学习才算是真正迈入入圈的第一步。