标准数据生成

标准数据生成

作者: 莫烦 编辑: 莫烦 发布于: 2021-10-07

数据是多变的,不光是数据的形态多变,里面的数值也是多变的。通常,我们在创建一个 Numpy Array 的时候, 是想带着一些数值来初始化的,比如我想先要一个全零的 Array。

所以这节内容,我想来说说怎么带着数值初始化,可以带着怎样的数值初始化。

创建统一数据

首先来点简单的,初始化 Array 的时候,让他们全部都为某数。最简单的就是全 0 或者全 1 的数据。

ones

你会发现,创建这些数据时,我们不光光可以给定要创建的具体数值是 0 还是 1,而且还能指定这个数据的 shape 是什么。 创建出来后,你就可以把它当成普通的 Array 数据使用就好了,要 reshape, transpose, 还是 sum 等操作,都是可以进行的。不信你就在上面的代码框试试。

我们可以创建 0 或 1 的数据,那我们能不能创建其它数值的数据的?答案是肯定的,用 np.full() 功能就好了。 同样,我们先输入这份数据的 shape,然后指定这份数据要全是什么数值。

在处理 shape 的时候,有件有趣的事。如果我们手头已经有一份数据,我们想创建一个和它类型一样,大小一样的另一份数据, 我们可以调用 np.xxx_like 这种形式的功能。看看下面这个例子,你就明白我的意思了。

因为 dtype 和 shape 都和源数据一样,那么它们俩之间做加减乘除运算就很契合了。 从上面的案例看出,其实 ones_like 其实算是一种偷懒功能,少写一些字而已。

同理,我们还有 np.zeros_like()np.full_like() 这两种。

创建统一数值的数据就是这么简单。

创建规则数据

而创建有些规律的数据也是 Numpy 的拿手好戏。首先我要说一个最常见的,arange 功能,这就有点像 Python 里的 range 功能,用来得到一个序列,我举个例子。

同样,np.arange() 也可以像 range() 一样,对范围做自定义更变或跳跃取值。

还有一个也是用来取一段数字中的值,这个我也比较常用,特别是在画折线图的时候,我想要连续在一个区间内取间隔一致的数据点。 里面的参数分别代表从 start 的值到 end 的值,一共返回这中间 num 个数据点。

更厉害的是,有时候我们会很纠结,上面是在-1 至 1 之间分了 4 个区域。 而我们想在-1 至 1 之间分 5 个区域,怎么搞?加一个 endpoint=False 就可以返回这 5 个区域的结节点了。

还有很多做特殊规则的数据的方式,比如 np.identity(), np.eye(), np.logspace() 等等, 这个教学我先介绍一些常用的,当你有需要的时候,你再单个搜索就行了。

快速创建再添加值

np.ones() 这种很相似的,有一个叫 np.empty() 功能,我想单独拎出来介绍一下。 如果你对运算速度有要求,你就得仔细听一下。

np.empty() 功能,不会初始化新建 array 里面的数值,所以你会看到这里面的数值都是乱乱的。 注意,虽然乱乱的,但是它不是随机数哦,你不能把它当随机数使用。 想用随机数的话,我后面有单独一个教学讲随机数

那又不能当随机数,又没有具体数值,这个 empty 到底为什么存在呢?

  1. 首先,可以当成一个 placeholder,一个容器先放着,之后慢慢放数据
  2. 创建起来比 ones, zeros, full 都快一点点

所以在这种情况下,我们才想使用 np.empty()。我们来对比一下创建速度。

我这里的结果是:还是可以快了几倍的速度。看完速度,我给你看看我一般是怎么使用的吧:

所以一般当我有一个数据要根据另一份数据生成的时候,无论我初始化是什么值,到最终都要全部被替换的时候,我就喜欢用 np.empty()。 ok,最后说一句,有 np.empty(),我们也有 np.empty_like() 用法和 np.zeros_like() 这种类似,很方便用的。

总结

不容易,你有多了解了一点 Numpy 作为数据怪兽的新功能。能够按自己的想法初始化最符合你需要的数据啦。


降低知识传递的门槛

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