标准数据生成
数据是多变的,不光是数据的形态多变,里面的数值也是多变的。通常,我们在创建一个 Numpy Array 的时候, 是想带着一些数值来初始化的,比如我想先要一个全零的 Array。
所以这节内容,我想来说说怎么带着数值初始化,可以带着怎样的数值初始化。
- 创建统一数据
np.zeros(), np.ones(), np.full()
np.zeros_like(), np.ones_like(), np.full_like()
- 创建规则数据
np.arange(), np.linspace()
- 快速创建再添加值
np.empty(), np.empty_like()
创建统一数据¶
首先来点简单的,初始化 Array 的时候,让他们全部都为某数。最简单的就是全 0 或者全 1 的数据。
你会发现,创建这些数据时,我们不光光可以给定要创建的具体数值是 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 到底为什么存在呢?
- 首先,可以当成一个 placeholder,一个容器先放着,之后慢慢放数据
- 创建起来比
ones
,zeros
,full
都快一点点
所以在这种情况下,我们才想使用 np.empty()
。我们来对比一下创建速度。
我这里的结果是:还是可以快了几倍的速度。看完速度,我给你看看我一般是怎么使用的吧:
所以一般当我有一个数据要根据另一份数据生成的时候,无论我初始化是什么值,到最终都要全部被替换的时候,我就喜欢用 np.empty()
。 ok,最后说一句,有 np.empty()
,我们也有 np.empty_like()
用法和 np.zeros_like()
这种类似,很方便用的。
总结¶
不容易,你有多了解了一点 Numpy 作为数据怪兽的新功能。能够按自己的想法初始化最符合你需要的数据啦。