使用函数进行简单的统计分析
-
-
- 排序
-
sort函数的排序方法可以指定一个axis参数,使得sort函数可以沿着指定轴对数据集进行排序,如代码 46所示。
代码 46 使用sort函数进行排序
In[10]: | np.random.seed(42) #设置随机种子 arr = np.random.randint(1,10,size = 10) #生成随机数 print('创建的数组为:',arr) |
Out[10]: | 创建的数组为: [7 4 8 5 7 3 7 8 5 4] |
In[11]: | arr.sort() #直接排序 print('排序后数组为:',arr) |
Out[11]: | 排序后数组为: [3 4 4 5 5 7 7 7 8 8] |
In[12]: | arr = np.random.randint(1,10,size = (3,3)) #生成3行3列的随机数 print('创建的数组为:',arr) |
Out[12]: | 创建的数组为: [[8 8 3] [6 5 2] [8 6 2]] |
In[13]: | arr.sort(axis = 1) #沿着横轴排序 print('排序后数组为:',arr) |
Out[13]: | 排序后数组为: [[3 8 8] [2 5 6] [2 6 8]] |
In[14]: | arr.sort(axis = 0) #沿着纵轴排序 print('排序后数组为:',arr) |
Out[14]: | 排序后数组为: [[2 5 6] [2 6 8] [3 8 8]] |
argsort函数和lexsort函数可以实现在给定一个或多个键下,得到一个有整数构成的索引数组,索引值说明了数据在新的顺序下的位置。如代码 47所示。
代码 47 使用argsort函数进行排序
In[15]: | arr = np.array([2,3,6,8,0,7]) print('创建的数组为:',arr) |
Out[15]: | 创建的数组为: [2 3 6 8 0 7] |
In[16]: | print('排序后数组为:',arr.argsort()) #返回值为重新排序值的下标 |
Out[16]: | 排序后数组为: [4 0 1 2 5 3] |
lexsort函数可以一次性对满足多个键的数组执行间接排序。使用lexsort函数排序如代码 48所示。
In[17]: | a = np.array([3,2,6,4,5]) b = np.array([50,30,40,20,10]) c = np.array([400,300,600,100,200]) d = np.lexsort((a,b,c)) #lexsort函数只接受一个参数,即(a,b,c) print('排序后数组为:',list(zip(a[d],b[d],c[d]))) #多个键值排序是按照最后一个传入数据计算的 |
Out[17]: | 排序后数组为: [(4, 20, 100), (5, 10, 200), (2, 30, 300), (3, 50, 400), (6, 40, 600)] |
-
-
- 去重和重复数据
-
在NumPy中可以通过unique函数找出数组中的唯一值并返回已排序的结果,如代码 49所示。
代码 49 数组内数据去重
In[18]: | names = np.array(['小明', '小黄', '小花', '小明', '小花', '小兰', '小白']) print('创建的数组为:',names) |
Out[18]: | 数组为: ['小明' '小黄' '小花' '小明' '小花' '小兰' '小白'] |
In[139: | print('去重后的数组为:',np.unique(names)) |
Out[19]: | 去重后的数组为: ['小兰' '小明' '小白' '小花' '小黄'] |
In[20]: | print('去重后的数组为:',sorted(set(names))) #跟np.unique等价的python代码实现过程 |
Out[20]: | 去重后的数组为: ['小兰', '小明', '小白', '小花', '小黄'] |
In[21]: | ints = np.array([1,2,3,4,4,5,6,6,7,8,8,9,10]) #创建数值型数据 print('创建的数组为:',ints) |
Out[21]: | 数组为: [ 1,2,3,4,4,5,6,6,7,8,8,9,10] |
In[22]: | print('去重后的数组为:',np.unique(ints)) |
Out[22]: | 去重后的数组为: [ 1,2,3,4,5,6,7,8,9,10] |
在NumPy中主要使用tile函数和repeat函数实现数据重复。如代码 410和代码 411所示
代码 410 使用tile函数实现数据重复
In[23]: | arr = np.arange(5) print('创建的数组为:',arr) |
Out[23]: | 创建的数组为: [0 1 2 3 4] |
In[24]: | print('重复后数组为:',np.tile(arr,3)) #对数组进行重复 |
Out[24]: | 重复后数组为: [0 1 2 3 4 0 1 2 3 4 0 1 2 3 4] |
In[25]: | np.random.seed(42) #设置随机种子 arr = np.random.randint(0,10,size = (3,3)) print('创建的数组为:',arr) |
Out[25]: | 创建的数组为: [[6 3 7] [4 6 9] [2 6 7]] |
In[26]: | print('重复后数组为:',arr.repeat(2, axis = 0)) #按行进行元素重复 |
Out[26]: | 重复后数组为: [[6 3 7] [6 3 7] [4 6 9] [4 6 9] [2 6 7] [2 6 7]] |
In[27]: | print('重复后数组为:',arr.repeat(2, axis = 1)) #按列进行元素重复 |
Out[27]: | 重复后数组为: [[6 6 3 3 7 7] [4 4 6 6 9 9] [2 2 6 6 7 7]] |
-
-
- 常用的统计函数
-
常用的统计函数使用示例如代码 412所示。
代码 412 NumPy中常用的统计函数
In[28]: | arr = np.arange(20).reshape(4,5) print('创建的数组为:',arr) |
Out[28]: | 创建的数组为: [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] |
In[29]: | print('数组的和为:',np.sum(arr)) #计算数组的和 |
Out[29]: | 数组的和为: 190 |
In[30]: | print('数组横轴的和为:',arr.sum(axis = 0)) #沿着横轴计算求和 |
Out[30]: | 数组横轴的和为: [30 34 38 42 46] |
In[31]: | print('数组纵轴的和为:',arr.sum(axis = 1)) #沿着纵轴计算求和 |
Out[31]: | 数组纵轴的和为: [10 35 60 85] |
In[32]: | print('数组的均值为:',np.mean(arr)) #计算数组均值 |
Out[32]: | 数组的均值为: 9.5 |
In[33]: | print('数组横轴的均值为:',arr.mean(axis = 0)) #沿着横轴计算数组均值 |
Out[33]: | 数组横轴的均值为: [ 7.5 8.5 9.5 10.5 11.5] |
In[34]: | print('数组纵轴的均值为:',arr.mean(axis = 1)) #沿着纵轴计算数组均值 |
Out[34]: | 数组纵轴的均值为:[ 2. 7. 12. 17.] |
In[35]: | print('数组的标准差为:',np.std(arr)) #计算数组标准差 |
Out[35]: | 数组的标准差为: 5.766281297335398 |
In[36]: | print('数组的方差为:',np.var(arr)) #计算数组方差 |
Out[36]: | 数组的方差为: 33.25 |
In[37]: | print('数组的最小值为:',np.min(arr)) #计算数组最小值 |
Out[37]: | 数组的最小值为: 0 |
In[38]: | print('数组的最大值为:',np.max(arr)) #计算数组最大值 |
Out[38]: | 数组的最大值为: 19 |
In[39]: | print('数组的最小元素为:',np.argmin(arr)) #返回数组最小元素的索引 |
Out[39]: | 数组的最小元素为: 0 |
In[40]: | print('数组的最大元素为:',np.argmax(arr)) #返回数组最大元素的索引 |
Out[40]: | 数组的最大元素为: 19 |
在NumPy中cumsum函数和cumprod函数采用不聚合计算,产生一个由中间结果组成的数组,如代码 413所示。
代码 413 cumsum函数和cumprod函数
In[41]: | arr = np.arange(2,10) print('创建的数组为:',arr) |
Out[41]: | 创建的数组为: [2 3 4 5 6 7 8 9] |
In[42]: | print('数组元素的累计和为:',np.cumsum(arr)) #计算所有元素的累计和 |
Out[42]: | 数组元素的累计和为: [ 2 5 9 14 20 27 35 44] |
In[43]: | print('数组元素的累计积为:',np.cumprod(arr)) #计算所有元素的累计积 |
Out[43]: | 数组元素的累计积为: [ 2 6 24 120 720 5040 40320 362880] |
以iris数据集中的花萼长度数据(已保存为csv格式)为例,对其进行统计分析,如代码 414所示。
In[44]: | #读取文件 iris_sepal_length = np.loadtxt("./iris_sepal_length.csv", delimiter=",") print('花萼长度表为:',iris_sepal_length) |
Out[44]: | 花萼长度表为: [5.1 4.9 4.7 4.6 5. 5.4 4.6 5. 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5. 5. 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5. 5.5 4.9 4.4 5.1 5. 4.5 4.4 5. 5.1 4.8 5.1 4.6 5.3 5. 7. 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5. 5.9 6. 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6. 5.7 5.5 5.5 5.8 6. 5.4 6. 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5. 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6. 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6. 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9] |
In[45]: | iris_sepal_length.sort() #对数据进行排序 print('排序后的花萼长度表为:',iris_sepal_length) |
Out[45]: | 排序后的花萼长度表为: [4.3 4.4 4.4 4.4 4.5 4.6 4.6 4.6 4.6 4.7 4.7 4.8 4.8 4.8 4.8 4.8 4.9 4.9 4.9 4.9 4.9 4.9 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.2 5.2 5.2 5.2 5.3 5.4 5.4 5.4 5.4 5.4 5.4 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.6 5.6 5.6 5.6 5.6 5.6 5.7 5.7 5.7 5.7 5.7 5.7 5.7 5.7 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.9 5.9 5.9 6. 6. 6. 6. 6. 6. 6.1 6.1 6.1 6.1 6.1 6.1 6.2 6.2 6.2 6.2 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.5 6.5 6.5 6.5 6.5 6.6 6.6 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.8 6.8 6.8 6.9 6.9 6.9 6.9 7. 7.1 7.2 7.2 7.2 7.3 7.4 7.6 7.7 7.7 7.7 7.7 7.9] |
In[46]: | print('去重后的花萼长度表为:',np.unique(iris_sepal_length)) #去除重复值 |
Out[46]: | 去重后的花萼长度表为: [4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1 7.2 7.3 7.4 7.6 7.7 7.9] |
In[47]: | print('花萼长度表的总和为:',np.sum(iris_sepal_length)) #计算数组总和 |
Out[47]: | 花萼长度表的总和为: 876.5 |
In[48]: | print('花萼长度表的累计和为:',np.cumsum(iris_sepal_length)) #计算所有元素的累计和 |
Out[48]: | 花萼长度表的累计和为: [ 4.3 8.7 13.1 17.5 22. 26.6 31.2 35.8 40.4 45.1 49.8 54.6 59.4 64.2 69. 73.8 78.7 83.6 88.5 93.4 98.3 103.2 108.2 113.2 118.2 123.2 128.2 133.2 138.2 143.2 148.2 153.2 158.3 163.4 168.5 173.6 178.7 183.8 188.9 194. 199.1 204.3 209.5 214.7 219.9 225.2 230.6 236. 241.4 246.8 252.2 257.6 263.1 268.6 274.1 279.6 285.1 290.6 296.1 301.7 307.3 312.9 318.5 324.1 329.7 335.4 341.1 346.8 352.5 358.2 363.9 369.6 375.3 381.1 386.9 392.7 398.5 404.3 410.1 415.9 421.8 427.7 433.6 439.6 445.6 451.6 457.6 463.6 469.6 475.7 481.8 487.9 494. 500.1 506.2 512.4 518.6 524.8 531. 537.3 543.6 549.9 556.2 562.5 568.8 575.1 581.4 587.7 594.1 600.5 606.9 613.3 619.7 626.1 632.5 639. 645.5 652. 658.5 665. 671.6 678.2 684.9 691.6 698.3 705. 711.7 718.4 725.1 731.8 738.6 745.4 752.2 759.1 766. 772.9 779.8 786.8 793.9 801.1 808.3 815.5 822.8 830.2 837.8 845.5 853.2 860.9 868.6 876.5] |
In[49]: | print('花萼长度表的均值为:',np.mean(iris_sepal_length)) #计算数组均值 |
Out[49]: | 花萼长度表的均值为: 5.843333333333334 |
In[50]: | print('花萼长度表的标准差为:',np.std(iris_sepal_length)) #计算数组标准差 |
Out[50]: | 花萼长度表的标准差为: 0.8253012917851409 |
In[51]: | print('花萼长度表的方差为:',np.var(iris_sepal_length)) #计算数组方差 |
Out[51]: | 花萼长度表的方差为: 0.6811222222222223 |
In[52]: | print('花萼长度表的最小值为:',np.min(iris_sepal_length)) #计算最小值 |
Out[52]: | 花萼长度表的最小值为: 4.3 |
In[53]: | print('花萼长度表的最大值为:',np.max(iris_sepal_length)) #计算最大值 |
Out[53]: | 花萼长度表的最大值为: 7.9 |