您的位置:首页 > 编程语言 > Python开发

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

2017-08-22 09:29 429 查看

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)

x
Out[8]:
array([-0.68947873,  1.36111303, -1.17163865, -0.03824335,  1.22156954,
1.55771773, -0.64768222,  0.50316306])

y
Out[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)*5

np.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)

ys
Out[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 plt

z = np.sqrt(xs ** 2 + ys ** 2)

z
Out[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],
...,
[
4000
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)

result
Out[7]: array([ 1.1,  2.2,  1.3,  1.4,  2.5])


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

#随机数列,正值换为2,负值换为-2
arr = np.random.randn(4,4)

arr
Out[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.25481374092506387

np.mean(arr)
Out[23]: -0.25481374092506387

arr.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]: True

bools.all()
Out[39]: False


4.4.4 排序

sort方法

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

arr = np.random.randn(8)

arr
Out[41]:
array([ 1.73783245, -2.47430763,  1.22541991, -0.02629202,  0.05707247,
-1.97234619,  0.78375069, -0.17947107])

arr.sort()

arr
Out[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)

arr
Out[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)#横向排序

arr
Out[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)#纵向排序

arr
Out[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


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

88c7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: