《利用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
相关文章推荐
- 机器学习--准备数据与Numpy(四)--利用数组进行数据处理
- Numpy 利用数组进行数据处理
- Chapter4-3 :利用数组进行数据处理
- 7068-2.Python数据分析:利用数组进行数据处理
- 利用sort对数组进行自定义排序
- 利用Arrays.sort(Array,Comparator)对数组进行排序
- 利用sort对数组进行自定义排序
- 利用“指针”对主调函数中数组进行排序,(菜鸟知道模块化)
- 使用java语言,利用多线程调用WebService进行数据处理
- 利用ArcToolBox ModelBuider进行数据处理
- 利用函数调用形式,传递一维数组名进行函数调用
- 利用Arrays.sort();方法对相应数组进行升序、降序排列
- Cal:一个封装类,利用方法对数组进行各种操作
- 利用函数调用,对数组进行初始化,更改,清零,逆置等操作
- 利用mmap和数组方式的存取操作对结构化数据文件进行修改
- 利用函数调用,对数组进行初始化,更改,清零,逆置等操作
- 可以利用数组进行多数排序
- 利用集合进行数组的排序
- 桶排序:利用数组下标进行排序
- 利用对象对数组进行去重排序