====== 使用numpy进行统计分析 ====== ===== 学习要点 ===== - 掌握数组中数据排序的方法 - 掌握数组中数据清洗的方法(包含去重以及数据的重复) - 掌握数组中各种统计功能的使用方法 ---- ===== 学习内容 ===== 在使用NumPy进行统计分析时,一般要考虑以下几个步骤:即对数据按照要求进行排序,然后对不符合要求的数据进行清洗,最后对数据进行统计。 ==== 数据的排序 ==== 在NumPy中的排序方式主要可以概括为直接排序和间接排序两种。 直接排序:对数值直接进行排序,常用函数为sort() 间接排序:根据一个或多个键对数据进行排序,常用函数为argsort()和lexsort() === sort()函数 === sort()函数是最常用的排序方法,无返回值 。在函数运行之后,原始数据会被修改。使用sort()函数排序时可以设置axis参数,用以指定排序的方向 。 Example1: 随机数的排序 >>> import numpy as np >>> np.random.seed(50) >>> arr = np.random.randint(1,10,10) # 创建一个数组arr包括10个1~9的随机整数 >>> arr.sort() # 对arr进行排序,并将修改arr中原有的值为新的顺序 # 此时顺序为升序,思考:如何改成逆序 >>> arr = np.random.randint(1,10,size=(3,3)) >>> arr.sort(axis = 1) >>> arr.sort(axis = 0) # axis参数,1代表横向,0代表纵向 **Expand1: random.seed的作用** random.seed()的作用是什么? seed( ) 用于指定随机数生成时所用算法开始的整数值。 - 如果使用相同的seed( )值,则每次生成的随即数都相同; - 如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。 - 设置的seed()值仅一次有效 Example2: order的用法 sort函数排序时,使用order 指定排序字段 >>> dt = np.dtype([('name', 'S10'),('age', int)]) >>> a = np.array([("kevin", 21),("peter",25),("tony", 17), ("mike",27)], dtype = dt) >>> print ('数组:') >>> print (a) >>> print ('\n') >>> print ('按 name 排序:') >>> print (np.sort(a, order = 'name')) === argsort()函数 === argsort函数对一维数组进行排序,排序时记录的是这个数组中排好序之后的索引数组。这个数组表示的是数据在新的序列中的位置。 Example3 >>> arr = np.array([3,2,5,7,8,0,4,1,9,6]) >>> arr.argsort() >>> arr[arr.argsort()] === lexsort()函数 === lexsort函数可以一次性对满足多个键的数组执行间接排序。其排序返回的值与argsort函数一样,都是返回的索引。对于这个函数的应用,可以把它想象成对电子表格进行排序,每一列代表一个序列 ,排序时优先照顾靠后的列。 这里举一个应用场景:小升初考试,重点班录取学生按照总成绩录取。在总成绩相同时,数学成绩高的优先录取,在总成绩和数学成绩都相同时,按照英语成绩录取…… 这里,总成绩排在电子表格的最后一列,数学成绩在倒数第二列,英语成绩在倒数第三列。 Example4 >>> arr1 = np.array([3,2,5,7,8]) >>> arr2 = np.array([8,42,15,71,28]) >>> arr3 = np.array([115,342,115,771,528]) >>> arr4 = np.lexsort((arr1,arr2,arr3)) >>> list(zip(arr1[arr4],arr2[arr4],arr3[arr4])) ==== 清洗数据 ==== 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。 === unique()函数 === 数据重复也是数据清洗过程中经常要去完成的一个方面。NumPy中提供了unique()函数来找出数组中的唯一值,并返回排序好的数组。 Example5 >>> vehicle = ['train','bus','ship','car','subway','ship','bicycle'] >>> np.unique(vehicle) === tile函数() === tile()函数用来对数据进行重复拼接。 函数格式: tile(A,reps) A : array_like, A的类型众多,几乎所有类型都可以:array, list, tuple, dict, matrix以及基本数据类型int, string, float以及bool类型。 reps : array_like, reps的类型也很多,可以是tuple,list, dict, array, int, bool.但不可以是float, string, matrix类型。表示A沿各个维度重复的次数 Example6 >>> arr = [1,2] >>> tile(arr,2) array([1, 2, 1, 2]) # 表示一个维度重复2次 >>> tile(arr,(1,2)) array([[1, 2, 1, 2]]) #表示第一个维度重复两次,第二个维度重复一次 >>> tile(arr,(2,2,3)) array([[[1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2]], [[1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2]]]) # 表示第一维度重复三次,第二个维度重复两次,第三个维度重复两次 === repeat()函数 === repeat()函数同样是用来对数据进行重复的。 用法有两种: numpy.repeat(a, repeats, axis=None) a.repeat(repeats, axis=None) 其中a为数组,repeats为重复的次数,axis表示数组维度 >>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a.repeat(5) array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9]) >>> a np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) #a数组的内容没改变 >>> a=np.array([10,20]) >>>a array([10,20]) >>> a.repeat([3,2]) array([10, 10, 10, 20, 20]) >>> repeat(a,[3,2]) # 对a数组中的对应元素进行重复复制,需要注意的是len(repeats)==a.shape[axis] array([10, 10, 10, 20, 20]) >>> a=np.array([[10,20],[30,40]]) >>> a.repeat([3,2],axis=0) array([[10, 20], [10, 20], [10, 20], [30, 40], [30, 40]]) >>> a.repeat([3,2],axis=1) array([[10, 10, 10, 20, 20], [30, 30, 30, 40, 40]]) ==== 统计函数 ==== 在NumPy中,常见的统计函数有以下几种: ^ 函数名 ^ 作用 ^ | sum(a, axis=None) | 据给定轴axis计算数组a相关元素之和,axis整数或元组 | | mean(a, axis=None) | 给定轴axis计算数组a相关元素的期望,axis整数或元组 | | average(a,axis=None,weights=None) | 据给定轴axis计算数组a相关元素的加权平均值 | | std(a, axis=None) | 据给定轴axis计算数组a相关元素的标准差 | | var(a, axis=None) | 据给定轴axis计算数组a相关元素的方差 | | min() | 求最小值 | | max() | 求最大值 | | ptp() | 最大值与最小的值差 | | np.intersect1d(arr1, arr2) | 找出两个数组公共的元素 | 以上函数在对数据进行统计时,如不指定axis参数,则表示对整个数组进行统计。当axis参数为1时,表示沿横轴进行计算,当axis参数为0时,表示沿纵轴进行计算。