python之基础numpy库使用(二)

来源:互联网 发布:软件过程成熟度cmm 编辑:程序博客网 时间:2024/06/05 15:58

接着第一篇的内容,下面介绍numpy中的一些通用函数(ufunc)的使用,它们可以实现快速的元素级操作以及利用数组进行数据处理

一、通用函数

(1)一元函数
Sqrt(开根号),exp(e指数)

In[13]: arr=np.arange(4)In[14]: np.sqrt(arr)Out[14]: array([ 0.        ,  1.        ,  1.41421356,  1.73205081])In[15]: np.exp(arr)Out[15]: array([  1.        ,   2.71828183,   7.3890561 ,  20.08553692])

(2)二元函数

如add,maximu等

In[17]: x=np.random.randn(4)In[18]: y=np.random.randn(4)In[19]: xOut[19]: array([-0.09464057, -1.09566782, -0.16559557, -1.22366449])In[20]: yOut[20]: array([-1.14346377,  0.94896985,  0.63510828, -0.70507939])In[21]: np.add(x,y)Out[21]: array([-1.23810434, -0.14669797,  0.46951271, -1.92874387])In[22]: np.maximum(x,y)Out[22]: array([-0.09464057,  0.94896985,  0.63510828, -0.70507939])

下表列出了一些常见的一元,二元ufunc

一元ufunc:



二元ufunc:





二、利用数组进行数据处理

Numpy可以使你将许多数据处理任务表达式简化为数组表达式(否则需要编写循环),这种做法,通常称为矢量化。

(1)将条件逻辑表述为数组运算(np.where)

np.where是三元表达式x if condition c else y的矢量化表示,如下所示:

In[23]: x=np.arange(4)In[24]: y=np.arange(6,10,1)In[25]: cond=np.array([True,False,False,True])In[26]: xOut[26]: array([0, 1, 2, 3])In[27]: yOut[27]: array([6, 7, 8, 9])

假设我们根据cond选择x,y的值,用列表推导式要如下写:

 In[28]: result=[(a if c else b ) for a,b,c in zip(x,y,cond)]In[29]: resultOut[29]: [0, 7, 8, 3]

这有两个问题,一是对大数组的处理速度不是很快,因为都是由纯python完成的,而是不能处理多维数组,

使用np.whrere则非常简单:

In[30]: result=np.where(cond,x,y)In[31]: resultOut[31]: array([0, 7, 8, 3])

np.where的第二个,第三个参数不必是数组,可以是标量值。它常用来根据一个数组生成另一个数组。Eg:假设有一个随机数组,希望将正数替换为2,负数替换为-2,那么可以这么写:

In[34]: arr=np.random.randn(4,4)In[35]: arrOut[35]: array([[-0.23423085,  0.56603778,  2.41838068, -1.53304005],       [ 0.24527869,  0.98127126, -1.29478977, -0.07787282],       [ 0.79075936, -1.10094307, -0.37013976,  1.14196413],       [-0.38953183, -1.93298157,  0.2568553 ,  0.66253162]])In[36]: result=np.where(arr>0,2,-2)In[36]: result=np.where(arr>0,2,-2)In[37]: resultOut[37]: array([[-2,  2,  2, -2],       [ 2,  2, -2, -2],       [ 2, -2, -2,  2],       [-2, -2,  2,  2]])

传递给where的数组大小可以不相等

In[41]: cond1=np.array([True,False,True])In[42]: cond2=np.array([True,False,True])In[43]: result=np.where(cond1&cond2,1,np.where(cond1,2,np.where(cond2,3,4)))In[44]: resultOut[44]: array([1, 4, 1])

大家可以想想要实现这个用if-else需要写多少行代码

(2)数学和统计方法

均值、方差、求和等运算

In[45]: arr=np.random.randn(4,4)In[46]: arr.mean()Out[46]: 0.023586723164668873In[47]: arr.sum()Out[47]: 0.37738757063470196

Mean和sum这类函数可以接受axis参数,用于计算该轴上的统计值,返回的结果少一维

说明一下,axis=0表示纵向计算,axis=1表示横向计算

array([[ 0.53736842, -2.01617125, -0.26598267, -0.11424592],       [ 0.23105824, -0.35664911, -0.3302801 ,  0.80088503],       [-0.89317546,  1.73113602,  1.56051572,  0.40903232],       [ 1.55380977, -1.01639561, -1.43964005, -0.01387776]])In[51]: arr.mean(axis=1)Out[51]: array([-0.46475786,  0.08625351,  0.70187715, -0.22902591])In[52]: arr.sum(axis=1)Out[52]: array([-1.85903143,  0.34501405,  2.8075086 , -0.91610365])
下表列出了基本的统计函数:

(3)布尔型数组

计数:

In[62]: arr=np.random.randn(100)In[63]: (arr>0).sum()   #计算正值的数量Out[63]: 54     

另外还有两个方法any 和all ,前者用来测试数组中是否存在一个或多个True,后者用来测试是否都是True

In[7]: bools=np.array([True,False,True,False])In[8]: bools.any()Out[8]: TrueIn[9]: bools.all()Out[9]: False

(4)排序

通过sort方法进行排序

array([ 1.52561448, -0.40076737, -0.35224861,  1.3611128 , -0.34397678,        0.72943324,  0.72299746,  0.96120321, -1.03709975, -1.01976425])In[19]: arr.sort()In[20]: arrOut[20]: array([-1.03709975, -1.01976425, -0.40076737, -0.35224861, -0.34397678,

这儿啰嗦两句,产生随机数可以用random库,也可以用numpy库,后者更强大一些,例如:

In[21]: arr=np.arange(10)    #直接产生随机整数In[22]: arrOut[22]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In[23]: np.random.shuffle(arr)     #打乱数组,类似于洗牌In[24]: arrOut[24]: array([5, 8, 6, 3, 9, 2, 1, 7, 4, 0])In[25]: np.random.permutation(10)      #直接产生一个随机数组Out[25]: array([2, 9, 4, 5, 1, 7, 3, 0, 8, 6])
(5)一些其他的常用函数


(6)数组的文件输入输出

np.save与np.laod是读写磁盘数组数据的两个主要函数,文件格式为.npy

In[26]: arr=np.arange(10)In[27]: np.save('arr_data',arr)    #文件名没有加.npy时会自动补上,但读取数必须加上In[28]: np.load('arr_data.npy')Out[28]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Ps:Np.savez可以将多个数组以压缩文件的格式保存,格式为npz

In[29]: np.savez('data',a=arr,b=arr)In[30]: data=np.load('data.npz')In[31]: data['a']Out[31]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In[32]: data['b']Out[32]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
(7)存取文本文件

主要函数是np.loadtxt()与np.savetxt(),此外还有np.genformtxt(),函数的主要参数有文件名,分隔符号,跳过的行数等,下面以np.savetxt()为例说明:

array([[-0.44397662,  0.67687121,  1.58190068],       [ 0.76849295, -2.02349839, -0.6229177 ],       [-0.8254104 , -0.27689501,  1.42820222]])In[6]: np.savetxt('arr.txt',arr)

文件保存在你编辑器的项目文件夹里面























原创粉丝点击