今天講一下numpy中一些常規(guī)的數(shù)據(jù)統(tǒng)計功能浆熔,以及如何操作數(shù)組的排序和搜索。
這些在實際的數(shù)據(jù)分析場景經(jīng)中常常用到桥帆。
統(tǒng)計操作
還是把常用的方法匯總一個表:
功能 | 方法 | 說明 |
---|---|---|
數(shù)組求和 | object.sum() | 計算一個數(shù)組的元素之和 |
求平均數(shù) | object.mean() | 計算一個數(shù)組的元素平均值 |
求方差 | object.var() | 計算一個數(shù)組的元素方差值 |
求標準差 | object.std() | 計算一個數(shù)組的元素方差值 |
求極差 | object.ptp() | 計算一個數(shù)組極大值和極小值之差 |
求中位數(shù) | np.median(a) | 計算一個數(shù)組的元素中位數(shù) |
求最大值 | object.max() | 計算一個數(shù)組的元素最大值 |
求中位數(shù) | object.min() | 計算一個數(shù)組的元素最大值 |
import numpy as np
arr = np.arange(10)
print('arr數(shù)組的和為:', arr.sum())
print('arr數(shù)組的平均值為:', arr.mean())
print('arr數(shù)組的方差為:', arr.var())
print('arr數(shù)組的標準差為:', arr.std())
print('arr數(shù)組的極差為:', arr.ptp())
print('arr數(shù)組的中位數(shù)為:', np.median(a=arr))
# 運算結(jié)果:
arr數(shù)組的和為: 45
arr數(shù)組的平均值為: 4.5
arr數(shù)組的方差為: 8.25
arr數(shù)組的標準差為: 2.8722813232690143
arr數(shù)組的極差為: 9
arr數(shù)組的中位數(shù)為: 4.5
arr = np.arange(10).reshape((2,5))
print('arr數(shù)組:\n', arr)
print('arr數(shù)組每列的最大元素為:', arr.max(axis=1))
print('arr數(shù)組的最小元素為:', arr.min())
# 運算結(jié)果:
arr數(shù)組:
[[0 1 2 3 4]
[5 6 7 8 9]]
arr數(shù)組每列的最大元素為: [4 9]
arr數(shù)組的最小元素為: 0
以上的統(tǒng)計方法中還有一些可選參數(shù)蘸拔。
如axis、dtype等通用參數(shù)环葵,或不同統(tǒng)計方法特定的可選參數(shù)等,用以實現(xiàn)更加精細的計算宝冕。
因為理解起來很容易张遭,這里不再展開細講。感興趣的可以百度地梨,或查看方法的源代碼菊卷。
- pycharm查看某個方法的源碼:按住ctrl左鍵單擊該方法。
排序操作
主要介紹兩個排序方法:
np.sort()宝剖,返回排序后的數(shù)組
sort()方法有幾個參數(shù)了解一下:
- a=洁闰, 指定排序的數(shù)組
- axis=, 指定排序的軸
- kind=万细,指定排序的算法
kind參數(shù)選擇不同的算法扑眉,其速度、復雜度赖钞、穩(wěn)定性等有一定差別腰素。從網(wǎng)上找了個介紹,了解一下即可:
kind參數(shù) | 速度 | 最壞復雜度 | 工作空間 | 穩(wěn)定性 |
---|---|---|---|---|
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=雪营,指定排序的字段(用于前面講過的結(jié)構(gòu)化數(shù)組)
import numpy as np
arr = np.random.randint(1,50,24).reshape((3,2,4)) # 1-49弓千,隨機生成24個元素,構(gòu)建(3,2,4)數(shù)組
sort_arr = np.sort(a=arr, axis=2, kind='mergesort') # 塊献起、行不變洋访,按列排序
print('arr數(shù)組:\n', arr)
print('排序后:\n', sort_arr)
# 運算結(jié)果:
arr數(shù)組:
[[[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數(shù)組:\n', arr)
print('排序后的索引:\n', sort_arr)
print('根據(jù)索引查找排序后的數(shù)組為:\n', arr[sort_arr])
# 運算結(jié)果:
arr數(shù)組:
[48 39 30 41 39 12 33 4 20 15 30 27]
排序后:
[ 7 5 9 8 11 2 10 6 1 4 3 0]
根據(jù)索引查找排序后的數(shù)組為:
[ 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數(shù)組:\n', arr)
print('滿足條件的元素坐標:\n', np.argwhere(arr > 5)) # argwhere返回索引坐標
print('滿足條件的元素索引值:\n', np.where(arr > 5)) # where返回索引值姻政。由于是二維的,返回行和列兩組索引值总寒,其索引一一對應
print('非零元素的索引值:\n', np.nonzero(arr))
print('數(shù)組元素最大值的索引坐標為:\n', np.argmax(arr)) # 把數(shù)組攤平后返回索引坐標
print('數(shù)組元素最小值的索引坐標為:\n', np.argmin(arr)) # 把數(shù)組攤平后返回索引坐標
# 提取數(shù)組中滿足某個條件的元素的方法:
print('數(shù)組中的元素是否大于5:\n', arr > 5) # 指定一個條件
print('大于5的元素有:\n', arr[arr > 5]) # 提取bool對應的元素值
# 運算結(jié)果:
arr數(shù)組:
[[ 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))
數(shù)組元素最大值的索引坐標為:
11
數(shù)組元素最小值的索引坐標為:
0
數(shù)組中的元素是否大于5:
[[False False False False]
[False False True True]
[ True True True True]]
大于5的元素有:
[ 6 7 8 9 10 11]