前言
刚开始学习数据挖掘时,有时总是对numpy和pandas傻傻分不清楚,这个问题在训练模型阶段输入训练数据的时候最为明显,下面就来详细介绍下numpy
Numpy
WHAT?
numpy是专门为科学计算设计的一个python扩展包,为python提供高效率的多维数组,也被称为面向阵列计算(array oriented computing),同时numpy也是github上的一个开源项目:numpy,numpy是基于c语言开发,所以这使得numpy的运行速度很快,高效率运行就是numpy的一大优势。
下面我们就来生成一个最简单的numpy对象,首先我们要导入numpy包,一般我们都把它命名为np:
1 | In [1]: import numpy as np |
接着就可以生成一个numpy一维数组:
1 | In [2]: a = np.array([[1,2,3]],dtype=np.int32) |
numpy中定义的最重要的数据结构是称为ndarray的n维数组类型,这个结构引用了两个对象,一块用于保存数据的存储区域和一个用于描述元素类型的dtype对象:
WHY?
二维数组的生成在python中我们还可以用到list列表,如果用list来表示[1,2,3],由于list中的元素可以是任何对象,所以list中保存的是对象的指针,如果要保存[1,2,3]就需要三个指针和三个整数对象,是比较浪费内存资源和cpu计算时间的,而ndarray是一种保存单一数据类型的多维数组结构,在数据处理上比list列表要快上很多,在这里我们可以用%timeit命令来检测两者的数据处理速度:
1 | In [9]: a = range(1000) |
由于相同数据大小的array运算直接作用到元素级上这一numpy特性,结果显而易见,在数据处理上numpy数组比使用for循环的list列表快的不是一点两点。
HOW?
OK,知道了numpy大概是个什么东西,下面我们就来介绍下numpy数组的一些常用操作: 这里生成一个3x3的矩阵作为例子:
1 | In [2]: data = np.array([[1,2,3],[4,5,6],[7,8,9]]) #等价于data=np.arange(1,10).reshape(3,3) |
查看矩阵信息:
1 | In [6]: data.shape #返回元组,表示n行n列 |
转换数据类型:
1 | In [11]: a = data.astype(float) #拷贝一份新的数组 |
数组之间的计算:
1 | In [15]: data+data |
可以看出相同规格的数组计算是直接作用在其元素级上的,那不同的规格的数组是否能进行运算呢,我们来看下这个例子:
1 | In [18]: data1 = np.array([[1,2],[1,2]]) #生成一个2x2numpy数组 |
我们可以看出不同规格的数组一起计算的话是会报出广播错误的,那是不是可以下结论了,别急我们再来看下方两个特殊例子:
1 | In [20]: data2 = np.array([[1,2,3]]) |
data2数组的列数量与data数组相等,data3数组的行数量与data数组相等,这两个numpy数组虽然规格与data数组不一样,但却依然可以与data数组进行运算。
数组的切片:
1 | In [24]: data[:2] #沿着行(axis=0)进行索引 |
这里需要注意的是,切片操作是在原始数组上创建一个视图view,这只是访问数组数据的一种方式。 因此原始数组不会被复制到内存中,传递的是一个类似引用的东西,与上面的astype()方法是两种不同的拷贝方式,这里我们来看一个例子:
1 | In [32]: a = data[1] |
当切片对象a改变时,data的对应值也会跟着改变,这是在我们日常数据处理中有时会疏忽的一个点,最安全的复制方法是使用 copy()方法进行浅拷贝:
1 | In [36]: a = data[1].copy() |
数组的布尔索引:
1 | In [43]: data |
数组的逻辑表达处理:
1 | In [46]: np.where(data>3,1,0) #大于3的标记为1,小于等于3的标记为0 |
数组的常用统计操作:
1 | In [47]: data.mean(axis=0) #沿着行(axis=0)进行索引,求出其平均值 |
1 | In [53]: data.cumsum(0) #沿着行(axis=0)进行索引,进行累加 |
数组的排序操作:
1 | In [55]: data=np.random.randn(4,4) |
注意:直接调用数组的方法的排序将直接改变数组而不会产生新的拷贝。
矩阵运算:
1 | In [62]: x=np.arange(9).reshape(3,3) |
在numpy中的linalg中有还有很多矩阵运算,比如svd分解,qr分解,cholesky分解等等。
numpy数据的读取和保存:
1 | In [68]: np.save('name',data) |
总结:
numpy的知识学到这里,就已经可以应付好日常的数据处理了,便捷的操作,高效的处理,都使得numpy成为科学计算的一大利器。
参考资料:
易百教程-numpy教程
scipy讲义-numpy
LEVEL-numpy ndarray详解
才学疏浅,欢迎评论指导