今天讲一下numpy中一些常规的数据统计功能,以及如何操作数组的排序和搜索。
这些在实际的数据分析场景经中常常用到。
统计操作
还是把常用的方法汇总一个表:
功能 | 方法 | 说明 |
---|---|---|
数组求和 | object.sum() | 计算一个数组的元素之和 |
求平均数 | object.mean() | 计算一个数组的元素平均值 |
求方差 | object.var() | 计算一个数组的元素方差值 |
求标准差 | object.std() | 计算一个数组的元素方差值 |
求极差 | object.ptp() | 计算一个数组极大值和极小值之差 |
求中位数 | np.median(a) | 计算一个数组的元素中位数 |
求最大值 | object.max() | 计算一个数组的元素最大值 |
求中位数 | object.min() | 计算一个数组的元素最大值 |
import numpy as np
arr = np.arange(10)
print('arr数组的和为:', arr.sum())
print('arr数组的平均值为:', arr.mean())
print('arr数组的方差为:', arr.var())
print('arr数组的标准差为:', arr.std())
print('arr数组的极差为:', arr.ptp())
print('arr数组的中位数为:', np.median(a=arr))
# 运算结果:
arr数组的和为: 45
arr数组的平均值为: 4.5
arr数组的方差为: 8.25
arr数组的标准差为: 2.8722813232690143
arr数组的极差为: 9
arr数组的中位数为: 4.5
arr = np.arange(10).reshape((2,5))
print('arr数组:\n', arr)
print('arr数组每列的最大元素为:', arr.max(axis=1))
print('arr数组的最小元素为:', arr.min())
# 运算结果:
arr数组:
[[0 1 2 3 4]
[5 6 7 8 9]]
arr数组每列的最大元素为: [4 9]
arr数组的最小元素为: 0
以上的统计方法中还有一些可选参数。
如axis、dtype等通用参数,或不同统计方法特定的可选参数等,用以实现更加精细的计算。
因为理解起来很容易,这里不再展开细讲。感兴趣的可以百度,或查看方法的源代码。
- pycharm查看某个方法的源码:按住ctrl左键单击该方法。
排序操作
主要介绍两个排序方法:
np.sort(),返回排序后的数组
sort()方法有几个参数了解一下:
- a=, 指定排序的数组
- axis=, 指定排序的轴
- kind=,指定排序的算法
kind参数选择不同的算法,其速度、复杂度、稳定性等有一定差别。从网上找了个介绍,了解一下即可:
kind参数 | 速度 | 最坏复杂度 | 工作空间 | 稳定性 |
---|---|---|---|---|
kind='quicksort' | 1 | O(n^2) | 0 | 弱 |
kind='quicksort' | 2 | O(n*log(n) | 0-(n/2) | 强 |
kind='quicksort' | 3 | O(n*log(n) | 0 | 弱 |
- order=,指定排序的字段(用于前面讲过的结构化数组)
import numpy as np
arr = np.random.randint(1,50,24).reshape((3,2,4)) # 1-49,随机生成24个元素,构建(3,2,4)数组
sort_arr = np.sort(a=arr, axis=2, kind='mergesort') # 块、行不变,按列排序
print('arr数组:\n', arr)
print('排序后:\n', sort_arr)
# 运算结果:
arr数组:
[[[24 40 47 38]
[37 10 27 11]]
[[ 7 17 2 26]
[24 41 42 6]]
[[32 22 4 37]
[13 48 7 16]]]
排序后:
[[[24 38 40 47]
[10 11 27 37]]
[[ 2 7 17 26]
[ 6 24 41 42]]
[[ 4 22 32 37]
[ 7 13 16 48]]]
np.argsort(),返回排序后的索引值
import numpy as np
arr = np.random.randint(1,50,12) # 1-49,随机生成24个元素
sort_arr = np.argsort(a=arr)
print('arr数组:\n', arr)
print('排序后的索引:\n', sort_arr)
print('根据索引查找排序后的数组为:\n', arr[sort_arr])
# 运算结果:
arr数组:
[48 39 30 41 39 12 33 4 20 15 30 27]
排序后:
[ 7 5 9 8 11 2 10 6 1 4 3 0]
根据索引查找排序后的数组为:
[ 4 12 15 20 27 30 30 33 39 39 41 48]
搜索
常用有以下搜索的方法:
功能 | 方法 |
---|---|
查找满足条件的元素的索引坐标 | np.argwhere('条件') |
查找满足条件的元素的索引值 | np.where('条件') |
查找非零元素的索引坐标 | np.nonzero() |
查找最大元素的索引坐标 | np.argmax() |
import numpy as np
arr = np.arange(12).reshape(3,4)
print('arr数组:\n', arr)
print('满足条件的元素坐标:\n', np.argwhere(arr > 5)) # argwhere返回索引坐标
print('满足条件的元素索引值:\n', np.where(arr > 5)) # where返回索引值。由于是二维的,返回行和列两组索引值,其索引一一对应
print('非零元素的索引值:\n', np.nonzero(arr))
print('数组元素最大值的索引坐标为:\n', np.argmax(arr)) # 把数组摊平后返回索引坐标
print('数组元素最小值的索引坐标为:\n', np.argmin(arr)) # 把数组摊平后返回索引坐标
# 提取数组中满足某个条件的元素的方法:
print('数组中的元素是否大于5:\n', arr > 5) # 指定一个条件
print('大于5的元素有:\n', arr[arr > 5]) # 提取bool对应的元素值
# 运算结果:
arr数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
满足条件的元素坐标:
[[1 2]
[1 3]
[2 0]
[2 1]
[2 2]
[2 3]]
满足条件的元素索引值:
(array([1, 1, 2, 2, 2, 2], dtype=int64), array([2, 3, 0, 1, 2, 3], dtype=int64))
非零元素的索引值:
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
数组元素最大值的索引坐标为:
11
数组元素最小值的索引坐标为:
0
数组中的元素是否大于5:
[[False False False False]
[False False True True]
[ True True True True]]
大于5的元素有:
[ 6 7 8 9 10 11]