维度很重要
Numpy 为什么在 Python 的科学计算上优势明显?其中最主要的一个原因是 Numpy 可以处理多维数据, 而且 Numpy 底层的 C 让它在多维数据上计算也非常快。
特别是在做机器学习,人工智能的时候,十有八九,人工智能的算法里面,就会出现多维数据的计算问题。可见多维数据在科学计算中的普遍性, 也可见 Numpy 真的是非常有价值的一个 Python 库。
在这一节内容中,我们主要涉及到的功能有:
- 创建数据
np.array()
array.ndim
- 添加数据
np.concatenate()
np.expand_dims()
- 合并数据
np.concatenate()
np.vstack()
np.hstack()
- 观察形态
array.size
array.shape
创建多维数据¶
想象我们要维护一个车辆数据信息,每一个数据,代表的是一辆车的百公里加速时间,首先就是要创建一个车辆百公里加速的列表。
你会发现,cars.ndim
会返回给你一个维度的属性,现在这组数据是一个一维数据。你可以认为这是某一次测试 4 款车收集到的数据。
测试批 | car1 | car2 | car3 | car4 |
---|---|---|---|---|
1 | 5 | 10 | 12 | 6 |
2 | 5.1 | 8.2 | 11 | 6.3 |
3 | 4.4 | 9.1 | 10 | 6.6 |
你看看,我们为了让结果更加准确,想着要多测几组数据,这就变成了一个二维数据了。在代码中,你可以这样一次性创建二维数据。
既然能创建二维数据,当然更高维度也不在话下啦,比如三维,可以表示,我在不同场地,多次测试不同测量,比二维数据多出来的一个维度就是不同场地
这个维度了。 比如下面这样:
四位或更多维我就不打出来了,太麻烦了。你懂这个意思就行。
添加数据¶
上面创建了一个多维数据,但是我还会有很多新增数据的需求,比如在原数据的基础上,要新增一条,我总不能每次新增的时候,都创建一整个大数据吧,这样多麻烦。 还好,Numpy 有很多添加数据的方法。
测试批 | car1 | car2 | car3 | car4 | car5 | car6 |
---|---|---|---|---|---|---|
cars | 5 | 10 | 12 | 6 | 5.2 | 4.2 |
这种一维的数据很简单,也很好理解,就和 Python 中的 List 添加很像。但是如果数据换成了二维呢?我要添加一组测试数据呢?
测试批 | car1 | car2 | car3 | car4 |
---|---|---|---|---|
cars1 | 5 | 10 | 12 | 6 |
cars2 | 5.1 | 8.2 | 11 | 6.3 |
合并数据¶
有同学肯定会问了,你既然能在第一个维度上叠加,那你能不能在第二个维度上叠加呢?当然可以,只需要巧妙给 np.concatenate
一个参数就好。
这里其实是一个 Numpy Array 合并的概念。只要维度能够对齐,你可以在任意维度上进行合并操作。注意,有些数据维度是对不齐的,这样没办法合并。比如:
1 | 2 | 3 | 7 | 8 |
4 | 5 | 6 | 9 | 10 |
除了 np.concatenate()
,还有两个比较好用的在二维数据上可以方便调用的功能,分别是 np.vstack()
, np.hstack()
.
可以将数据横向合并:
1 | 2 | 5 | 6 |
3 | 4 | 7 | 8 |
也可以将数据竖向合并:
1 | 2 |
3 | 4 |
5 | 6 |
7 | 8 |
观察形态¶
除了 np.ndim
来查看数据的形态,其实我们有时候还想更加了解数据的细节问题,比如这个数据的大小,规格。方便我们管理这些数据。
比如当我想知道到底有多少车辆测试数据时,你可能会通过遍历的方法来计数。
你看上面写的多麻烦。其实 Numpy 还有更好用的方式获取总个数。看看使用 cars.size
更进一步,我不光想知道总数据,我还想知道当前有多少次测试(第一个维度,行),和在多少辆车上测试了(第二个维度,列)。怎么办?
总结¶
数据是多样的,有时候会跨越很多个维度。所以理解维度,理解形态对于科学计算中,数据的理解,都是十分重要的。