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([,,])#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的形式和思路就行,不是把上面的内容死记硬背下来,那样没有意义,关键是一种学习的方法和学习的能力。把基本功练扎实了,咱们才能一起一路打怪升级。

05-27 21:03