NUMPY(如下简称NP)是Python数据分析必不可少的第三方库,np的出现必定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型。现在,np被Python其它科学计算包做为基础包,已成为Python 数据分析的基础,能够说,NP是SciPy、Pandas等数据处理或科学计算库最基本的函数功能库。所以,理解np的数据类型对python数据分析十分有帮助。
下面,本文将介绍Np的经常使用操做和基本数据类型。python
NP提供了如下重点功能。数组
为了更加直观的了解Np的强大与做用,咱们先看做用再看方法:数据结构
在操做数据以前,咱们先来理解什么是维度:dom
维度是一组数据的组织形式,不一样数据维度可能表示不一样的含义。
一维数据由对等关系的有序或无序数据构成,采用线性方式组织,能够用数组表示。
通俗来说,函数
1,2,3,4工具
这么一行数据就能够称之为一维数据,但若是咱们再对其折叠:性能
1,2,
3,4ui
那么他就成为了二维数据,又能够称之为矩阵。excel
数据集,顾名思义就是数据的集合,是用以训练程序的数据集合,通常是二维或者多维数表。
若是咱们想本身手工新建一个数据集,能够直接新建一个文本文件,只要有恰当的数据,均可以称之为数据集:code
城市,环比,同比,定基 北京,100.1,100.2,100.3 上海,111.1,111.2,111.3 南京,133.0,133.3,133.4
好比这样,咱们就能够称上面的文件称之为数据集。
咱们还注意到,上面数据是使用逗号做为分隔符分隔数据的,它简单描述了数据的内容和含义,并使用半角逗号做为分隔符。
像这样,用逗号分隔的数据集就称之为CSV(Comma-Separated Value,逗号分隔值)数据集,它是一种常见的文件格式,用来存储批量的数据。它就像一张excel表,用来存储简单结构的数据。
怎么样,数据集的概念是否特别简单呢?
数据集是一个简单的概念,但每次使用手工的方式去写毕竟不方便,因此,咱们可使用np的内置函数来生成数据集:
np.savetxt(frame,array,fmt='%.18e",delimiter=None)
咱们能够这样写下代码:
a= np.arange(20).reshape(4,5) np.savetxt('demo.csv',a,fmt='%d',delimiter=',')
这样,咱们就会在当前的工做目录下发现一个新的demo.csv,用记事本打开,里面是一个4 * 5的矩阵,元素0~19。
既然生成,那就能够读取,一样使用np:
np.loadtxt(frame,dtype=np.float,delimiter=None,inpack=False)
一样的咱们只须要写下代码:
np.loadtxt("demo.csv",delimiter=",")
就能够查看到咱们先前写入的数组a。
能够发现,CSV文件只能有效存储和读取一维和二维数组,由于更高的维度没法更直观的文本下显现出来,这时,更加灵活的存取方式就呼之欲出了,但讲以前先卖个关子,再介绍一个不太经常使用的方法:tofile:
对于NP中的ndarray数组,咱们可使用NP中的tofile方法。
a.tofile(frame,sep='',format='%d')
一样,咱们只须要命令:
import numpy as np a = np.arange(100).reshape(5,10,2) a.tofile("a.dat",sep=',',format='%d')
就能够生成新的CSV数据集。
此时,咱们若是打开a.dat文件,咱们能够看到数组1,2,3……99。可是与CSV不一样,这个文件并无包含数字的维度信息,他只是将数组全部元素逐一的列出。并且若是咱们不指定sep,将保存为二进制文件,虽然对人不可读,但将占用更小的空间。
既然tofile能够保存文本文件,那么也很容易猜到对应的fromfile能够还原这些信息。
np.fromfile(frame,dtype=float,count=-1,sep='')
若是咱们想要从新恢复数据的维度信息,咱们须要从新使用reshape来恢复维度信息:
c = np.fromfile("b.dat",sep=',',dtype=np.int).reshape(5,10,2)
不得不说,当我看到这个方法时感受这两个真是蠢爆了,使用savetxt / loadtxt 至少还能保存个二维信息,而使用了tofile / fromfile 方法竟然把数被伸展为一维的,而后本身记住维度信息(╯‵□′)╯︵┻━┻。
所以,为了保存更复杂的数据类型,二维以上的数据信息,save / load 函数成功解决了这个问题:(为了方便,两个函数就放到一块儿了)
np.save(frame,array)或np.savez(fname,array)(压缩) + frame:文件名,以.npy为扩展名,压缩扩展名为.npz + array:数组变量 np.load(fname)
Demo:
a = np.arange(100).reshape(5,10,2) np.save("a.npy",a) b=np.load("a.npy")
附录中提供NP的经常使用方法及注释,作查询用。
>>>lst = [[1,3,5],[2,4,6]] >>>np_lst = np.array(lst,dtype=np.float) >>>print(np_lst.shape)#返回数组的行列 >>>print(np_lst.ndim)#返回数组的维数 >>>print(np_lst.dtype)#返回数据类型,float默认为64 >>>print(np_lst.itemsize)#np.array每一个元素的大小,float64占8个字节 >>>print(np_lst.size)#大小,6个元素 (2, 3) 2 float64 8 6
>>>print(np.zeros([2,4])#初始化一个2行4列的数组 >>>print(np.ones([2,4]) [[ 0. 0. 0. 0.] [ 0. 0. 0. 0.]] [[ 1. 1. 1. 1.] [ 1. 1. 1. 1.]]
>>>print(np.random.rand(2,4))#将生成一个处于0~1之间2行4列的随机数序列(不加参数将只返回一个) [[ 0.39531286 0.4845 0.1463168 0.82327991] [ 0.89042255 0.65049931 0.43890163 0.89577744]]
若是想要多个随机整数:
print(np.random.randint(22,55,3))#必须有(前两个参数)指定范围,第三个参数用于指定生成的个数 [27 40 29] print(np.random.randn(2,4))#生成标准正态随机数 [[-1.15561548 0.3689953 0.38253231 -1.16346441] [-1.32625322 -0.41707673 -0.11822205 -0.95807535]] print(np.random.choice([10,20,40,33]))#从指定可迭代的数组中生成随机数 20 print(np.random.beta(1,10,4))#生成4个beta分布 [ 0.02258548 0.25848896 0.00696899 0.0609543 ]
print(np.arange(1,11,2))#获得step为2的range序列 [1 3 5 7 9]
还可使用reshape函数,对数组结构重定义:
print(np.arange(1,11).reshape(2,5))#(5能够缺省为-1) [[ 1 2 3 4 5] [ 6 7 8 9 10]]
下面介绍一些经常使用的运算操做:
lst=np.arange(1,11).reshape(2,5) print(np.exp(lst))#天然指数操做 [[ 2.71828183e+00 7.38905610e+00 2.00855369e+01 5.45981500e+01 1.48413159e+02] [ 4.03428793e+02 1.09663316e+03 2.98095799e+03 8.10308393e+03 2.20264658e+04]]
此外,还能够sqrt、log、sin、sum、max等操做:
咱们下定义一个三维数组:
lst = np.array([ [[1,2,3,4],[4,5,6,7]], [[7,8,9,10],[10,11,12,13]], [[14,15,16,17],[18,19,20,21]] ]) print(lst.sum()) 252
咱们能够看到sum方法对lst的全部元素都进行了求和,此外咱们还能够经过对sum方法增长参数axis的方式来设置求和的深刻维度:
print(lst.sum(axis=0)) [[22 25 28 31]#22=1+7+14;25=2+8+15 [32 35 38 41]] print(lst.sum(axis=1)) [[ 5 7 9 11]#5=1+4;7=2+5 [17 19 21 23] [32 34 36 38]] print(lst.sum(axis=2)) [[10 22]#10=1+2+3+4;22=4+5+6+7 [34 46] [62 78]]
这里的axis取值为数组维数-1,axis能够理解为进行运算操做时的深刻程度,axis越大,深刻程度越大。同理,不只sum函数,max等函数也能够同样理解。
numpy.array是np最简单的数据结构。np.array相比与Python原生列表其强大之处在于能够实现对数组数据的运算。咱们知道,list只能对元素的追加。而numpy是真正意义上的数据运算。
例如
In [1]: import numpy as np In [2]: list1 = np.array([10,20,30,40]) In [3]: list2 = np.array([4,3,2,1]) In [4]: print(list1) [10 20 30 40] In [5]: print(list1+list2) [14 23 32 41]
但np最强大的地方不在于简单的一维运算,Np对矩阵也能进行基本的运算操做:
lst1 =np.array([10,20,30,40]) lst2 = np.array([4,3,2,1]) print(np.dot(lst1.reshape([2,2]),lst2.reshape([2,2]))) [[10 22] [34 46] [62 78]] [[ 80 50] [200 130]]
此外,因为原生list没有肯定的数据类型,因此维护起来成本较高,而使用C编写的numpy,则能够声明各类常见的数据类型:
lst = [[1,3,5],[2,4,6]] np_lst = np.array(lst,dtype=np.float)
np所支持的数据类型都有bool、int8/16/32/64/128/、uint8/16/32/64/12八、float16/32/4三、complex64/12八、string。
Python做为一门弱类型语言,有其不可避免的缺点。但NP的出现,弥补了这些缺点,使其具有了构造复杂数据类型的能力,为Python数据分析提供了基础。