Numpy 是专门为数据科学或者数据处理相关的需求设计的一个高效的组件. 听起来是不是挺绕口的, 其实简单来说就 2 个方面, 一是 Numpy 是专门处理数据的, 二是 Numpy 在处理数据方面很牛逼 (肯定比 Python 原生组件牛逼, 否则也不会另外再来搞个 Numpy 了吧). 其实更加细化的来看其实 Numpy 最常用的就是矩阵(Matrix) 的处理. 如何有一点数据处理方面的经验的话, 无论你每一条数据有多少个 features(特征), 它终究是一个二维的矩阵. 所以 Numpy 在数据处理方面是非常常用的. 就是简单点理解就是 Numpy 其实就是封装了 Python 中的 list,Numpy 其实就是一个 high level 的 List 而已, 它没有什么牛逼的, 底层还是 Python. 好了, 闲话少扯了, 上面的我个人觉得说的有点小啰嗦了, 容易把人搞晕了. 咱们还是直接看看下面的例子, 看看 Numpy 的创建, 索引, 函数吧. 下面并不包括 Numpy 的所有功能, 具体很多细节, 大家要学会看文档, 下面的内容主要介绍一些最基本最常用的一些功能, 下面的内容只是一个方向指导作用, 具体在业务需求中需要用到什么 API 麻烦还是要大家自己去找文档查看吧.
Numpy 的创建和结构分析
好了, 既然咱们这里要说说 Numpy, 那咱们就肯定得先有一个 Numpy 对象啊 (如果不知道啥叫对象, 麻烦大家直接去看 Hello world). 创建 Numpy 对象的步骤是先导入 Numpy 库, 然后直接调用 array() 方法. 详情请看下面的实例.
- import numpy as np
- w = np.array([3,0,5])#w is a numpy array
- type(w)
上面的代码实例其实就是创建了一个 numpy, 注意它这里的 w 的类型已经不是 list 了, 而是 ndarray(其实就是 numpy data array 的简称). w 的值也是 array([3,0,5])了, 而不是直接的 [3,0,5]. 这里直接就从表象(也就是最直观的方面) 区别了 numpy array 和 list 的区别了. 为了更加直观的展现 numpy 的结构, 下面再用一个二维数组的例子来说明.
- a = np.array([[1,2],[3,4],[5,6]])#a is a 2-dimensional numpy array
- print(a)
上面这是一个二维的 Numpy array. 其实如果你仔细看, 她就是把 Python 中的 list 作为参数传递给了 numpy.array()这个方法. a 的值如下所示
- array([[1, 2],
- [3, 4],
- [5, 6]])
到目前为止, 大家肯定心里犯嘀咕了, 这 TM 也没有什么牛逼的啊, 比 Python 中的 list 搞得还复杂, 毕竟 Python 中的 list 也可以是一维的也可以是多维的, 而且表现形式还更加简单快速, 还更加底层, 因而运行速度也更加快. 如果仅仅是这么简单, 说明你们还是太天真, 很傻很可爱. 哈哈哈哈哈哈, 下面我就来说说社会主义的优越性(错了, 是 Numpy 在数据处理中的优越性)
Numpy 中常用的 properties 和 method
要说 Numpy 的牛逼之处, 就不得不说它提供了丰富的 API 来快速简单的操作 matrix. 首先来介绍一下最常用的 properties:transpose(T)和 shape. 这两个 properties(不是我装逼, 真是忘了中文翻译是啥了, 应该叫成员变量还是啥的). 如果你想转置一个矩阵, 下面一行代码搞定
- a = np.array([[1,2,3],[4,5,6]])
- print(a.T)#transpose of matrix a
一行代码搞定矩阵的转置, 方便吧, 上面代码返回值如下:
- array([[1, 4],
- [2, 5],
- [3, 6]])
另外一个重要的特性就是 shape 啦. 这个关键字可以直接返回矩阵的 row 和 column, 在进行数据预处理前, 了解数据的这些特性, 可以非常有效的帮助我们了解数据. 例如上面我们的 a 是一个 2 行 3 列的矩阵, 那么下面的代码就返回(2,3)
a.shape #return a tuple (2,3)
另外, Numpy 中有一个非常常用的函数叫做 reshape(), 它的参数分别是 row 和 column 的数量, 记住 reshape 前后, 元素的数量要一致, 否则会报错. 什么意思呢, 就是加入一个矩阵 a 是 2*3 的矩阵, 那么你可以 reshape(3,2)或者 reshape(6,1), 如果你 reshape(2,1)它就会报错. 还是那上面的例子吧, 参看下面的例子
- a1 = a.reshape(3,2)
- a2 = a.reshape(6,1)
上面的返回值分别是
- array([[1, 2],
- [3, 4],
- [5, 6]])
- array([[1],
- [2],
- [3],
- [4],
- [5],
- [6]])
这个功能是不是很牛逼呢. 哈哈..
Index 和 slicing
既然是矩阵, indexing 和 slicing 应该是经常要用到的, 在机器学习中, 尤其是 slicing 更是几乎都要用到. 首先 index 的话, 既可以直接索引一个元素, 也可以索引一行数据或者一列数据. 具体的实例如下所示
- a = np.array([[1,2,3],[4,5,6]]) #create a 2d numpy array
- a[0,1]#retrieve the element in the numpy array a with the index of (row = 0, column = 1)
- a[0]#retrieve the first row of the matrix a, the effect is the same as a[0,:]
- a[:,1]#retrieve the second column of the matrix a
具体的代码解释就看看上面的注释就行了. 这里需要解释一下细节部分就是上面 a[0,1]返回的是一个 scalar(实数),a[0]和 a[:,1]返回的都是一维 numpy 数组, 即使是取的第二列数据, 也是一维的而不是二维的. 即上面代码的返回值如下:
- 2
- array([1,2,3])
- array([2,5])
对于 slicing 而言, 她的返回值的维数始终等于原数组的维数, 这句话啥意思呢, 简单来说, slicing 分割出来的结果, 哪怕只是分割一个元素, 它的维数也是跟原数组的维数一样. 例如分割一个二维数组, 无论你怎么分割, 它的结果都是二维的. 这是跟 index 最大的一个区别. slicing 的结构是 array[row_start:row_end, column_start:column_end]. 具体的实例如下所示
- a[0:1,:]# return the first row, 2d array
- a[:,0:1]# return the first column, 2d array
- a[0:1,0:1]#return the cross of first row and first column, it is still a 2d numpy array though is a single element
看看上面的分割例子, 第一个是只沿着 row 的方向分割, 第二个是只沿着 column 的方向分割, 第三个是即沿着 row 也沿着 column 的方向分割. 他们的结果的 structure 都是和 a 的 structure 一样, 都是二维的. 结果如下:
- array([[1, 2, 3]])
- array([[1],
- [4]])
- array([[1]])
总结: 最后国际惯例都来个大总结啦. 其实在机器学习中 numpy 的常用用法就上面这些, 例如创建, index,slicing,transpose 和 reshape. 这些方法和应用场景是最常见的. 虽然前面说了这么多 numpy 的介绍, 但是 numpy 的库博大精深, 数以万计的 API 等待着大家去探索. 哈哈哈, 莫慌莫慌. 随后 numpy 相当于封装了 Python 中的 list, 但是在后面你们会看见, 机器学习的实践中直接操作 numpy 的几率比较少, 因为后面还有更牛逼的处理数据的库, 那就是大 boss---pandas. 你们也可以理解 pandas 是对 numpy 的进一步抽象和封装, 使用起来更加方便快捷. 所以大家先理解, 记住关键是理解 numpy 的形式和思路就行, 不是把上面的内容死记硬背下来, 那样没有意义, 关键是一种学习的方法和学习的能力. 把基本功练扎实了, 咱们才能一起一路打怪升级.
来源: https://www.cnblogs.com/tangxiaobo199181/p/12121958.html