《利用python进行数据分析》学习笔记(二)4.3 通用函数 4.4 利用数组进行数据处理

来源:互联网 发布:淘宝卖家借贷平台 编辑:程序博客网 时间:2024/05/16 18:39

NumPy

4.3 通用函数:快速的元素级数组函数

通用函数(ufunc)——对数组中的数据执行元素级运算。
许多ufunc都是简单的元素级变体,如sqrt和exp,都是一元ufunc。

arr = np.arange(10)np.sqrt(arr)Out[4]: array([ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ,        2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ])np.exp(arr)Out[5]: array([  1.00000000e+00,   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])        

另外一些(如add或maximum)接受2个数组,二元ufunc,并返回一个结果数组。

x=np.random.randn(8)y=np.random.randn(8)xOut[8]: array([-0.68947873,  1.36111303, -1.17163865, -0.03824335,  1.22156954,        1.55771773, -0.64768222,  0.50316306])yOut[9]: array([-0.80266484,  0.13872269,  0.15424391,  1.10861607,  0.47519071,        0.18366251, -1.7316151 , -0.68234186])np.maximum(x,y)#元素级最大值Out[10]: array([-0.68947873,  1.36111303,  0.15424391,  1.10861607,  1.22156954,        1.55771773, -0.64768222,  0.50316306])

部分ufunc函数可以返回多个数组。modf_用于返回浮点数数组的小数和整数部分。

arr = np.random.randn(7)*5np.modf(arr)Out[12]: (array([-0.56532589, -0.08808695,  0.5367083 , -0.1073143 , -0.9194454 ,        -0.98865822, -0.43391299]), array([-4., -6.,  2., -4., -7., -3., -3.]))

4.4 利用数组进行数据处理

points = np.arange(-5,5,0.01)#1000个间隔相等的点xs,ys=np.meshgrid(points,points)ysOut[15]: array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],       [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],       [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],       ...,        [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],       [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],       [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])import matplotlib.pyplot as pltz = np.sqrt(xs ** 2 + ys ** 2)zOut[18]: array([[ 7.07106781,  7.06400028,  7.05693985, ...,  7.04988652,         7.05693985,  7.06400028],       [ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,         7.04985815,  7.05692568],       [ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,         7.04278354,  7.04985815],       ...,        [ 7.04988652,  7.04279774,  7.03571603, ...,  7.0286414 ,         7.03571603,  7.04279774],       [ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,         7.04278354,  7.04985815],       [ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,         7.04985815,  7.05692568]])plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()Out[19]: <matplotlib.colorbar.Colorbar at 0xc321f60>

一个二维数组的图形化结果

plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")Out[20]: <matplotlib.text.Text at 0xc497588>

这里写图片描述

4.4.1 将条件逻辑 表述为数组运算

存在一个布尔值cond,两个值数组xarr、yarr。若cond为True,则xarr,反之,则选yarr。传统列表式效率不高,在此使用np.where,功能简洁:

xarr = np.array([1.1,1.2,1.3,1.4,1.5])yarr = np.array([2.1,2.2,2.3,2.4,2.5])cond = np.array([True,False,True,True,False])result = np.where(cond,xarr,yarr)resultOut[7]: array([ 1.1,  2.2,  1.3,  1.4,  2.5])

np.where的第二个和第三个参数不必是数组,他们都可以是标量值。还可根据另一个数组产生一个新的数组。

#随机数列,正值换为2,负值换为-2arr = np.random.randn(4,4)arrOut[10]: array([[ 0.09749476,  1.25856906, -0.00228609, -0.91133199],       [-1.16057625, -0.5288932 , -0.18969358,  0.38215547],       [-1.2786843 ,  0.8257289 ,  0.59391039, -2.01768602],       [ 0.56587339,  0.60116669,  0.57626928,  1.55148297]])np.where(arr>0,2,-2)Out[11]: array([[ 2,  2, -2, -2],       [-2, -2, -2,  2],       [-2,  2,  2, -2],       [ 2,  2,  2,  2]])
#正值换为2,负值不变 np.where(arr>0,2,arr)Out[12]: array([[ 2.        ,  2.        , -0.00228609, -0.91133199],       [-1.16057625, -0.5288932 , -0.18969358,  2.        ],       [-1.2786843 ,  2.        ,  2.        , -2.01768602],       [ 2.        ,  2.        ,  2.        ,  2.        ]])

存在两个布尔型数组cond1和cond2,根据4种不同的布尔值组合实现不同的赋值操作:

cond1 = np.array([True,False,False,True,True])cond2 = np.array([False,True,True,False,True])np.where(cond1 & cond2 ,0,np.where(cond1,1,np.where(cond2,2,3)))Out[17]: array([1, 2, 2, 1, 0])

4.4.2 数学和统计方法

可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算。sum、mean、以及标准差std等聚合计算,通常叫做约简。可当作数组的实例方法调用,也可以用顶级Numpy函数使用:

arr = np.random.randn(5,4)arr.mean()Out[22]: -0.25481374092506387np.mean(arr)Out[23]: -0.25481374092506387arr.sum()Out[24]: -5.0962748185012776

sum、mean可以接受一个axis参数(用于计算该轴向上的统计值),结果为一个一维数组。

arr.mean(axis=1)Out[25]: array([-0.38009628,  0.73487404, -0.48532156,  0.21747252, -1.36099742])arr.sum(0)Out[26]: array([-4.51185637,  1.33285769, -2.36087463,  0.44359849])

其他如cumsum和cumprod之类的方法则不聚合,而是产生一个由中间结果组成的数组:

arr = np.array([[1,2,3],[4,5,6],[7,8,9]])arr.cumsum(0)#所有元素的累积和Out[35]: array([[ 1,  2,  3],       [ 5,  7,  9],       [12, 15, 18]])arr.cumprod(1)#所有元素的累计积Out[36]: array([[  1,   2,   6],       [  4,  20, 120],       [  7,  56, 504]])

4.4.3 用于布尔型数组的方法

布尔值会被强制转换为1(True)和0(False)。
三个方法:sum经常被用于对布尔型数组中的True进行计数
any:用于测试数组中是否存在一个或多个True
all:检查数组中所有值都是否都是True

bools = np.array([False,False,True,True])bools.any()Out[38]: Truebools.all()Out[39]: False

4.4.4 排序

sort方法
一维数组即是从小到大依次排列

arr = np.random.randn(8)arrOut[41]: array([ 1.73783245, -2.47430763,  1.22541991, -0.02629202,  0.05707247,       -1.97234619,  0.78375069, -0.17947107])arr.sort()arrOut[43]: array([-2.47430763, -1.97234619, -0.17947107, -0.02629202,  0.05707247,        0.78375069,  1.22541991,  1.73783245])

多维数组可以在任何一个轴向上进行排列,只需将轴编号传给sort

arr = np.random.randn(5,3)arrOut[46]: array([[-0.71816736, -0.28177646, -0.62136327],       [ 3.04445923, -0.77561378,  1.74666301],       [ 0.34595802, -0.03910596,  1.49981186],       [ 0.03947258, -0.90375127,  1.08509195],       [-1.77375385, -1.23477466, -0.46638479]])arr.sort(1)#横向排序arrOut[48]: array([[-0.71816736, -0.62136327, -0.28177646],       [-0.77561378,  1.74666301,  3.04445923],       [-0.03910596,  0.34595802,  1.49981186],       [-0.90375127,  0.03947258,  1.08509195],       [-1.77375385, -1.23477466, -0.46638479]])arr.sort(0)#纵向排序arrOut[50]: array([[-1.77375385, -1.23477466, -0.46638479],       [-0.90375127, -0.62136327, -0.28177646],       [-0.77561378,  0.03947258,  1.08509195],       [-0.71816736,  0.34595802,  1.49981186],       [-0.03910596,  1.74666301,  3.04445923]])

顶级排序方法np.sort返回的是数组的已排序副本,而就地排序则会修改数组本身。计算数组分位法最简单的办法就是对其进行排序,然后选取特定位置的值。

large_arr = np.random.randn(1000)large_arr.sort()large_arr[int(0.05 * len(large_arr))] #5%分位数Out[53]: -1.6057584018636224

4.4.5 唯一化以及其他的集合逻辑

np.unique函数:用于找出数组中的唯一值并返回已排序的结果。
np.inld函数:测试一个数组的值在另一个数组的成员资格,返回一个布尔型数组。

 names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])np.unique(names)Out[55]: array(['Bob', 'Joe', 'Will'],       dtype='|S4')ints = np.array([3,3,3,2,2,1,1,4,4])np.unique(ints)Out[57]: array([1, 2, 3, 4])
values = np.array([6,0,0,3,2,5,6])np.in1d(values,[2,3,6])Out[60]: array([ True, False, False,  True,  True, False,  True], dtype=bool

第一次写博客,如有错误,欢迎指正!

阅读全文
0 0