給定一堆數字,需要統計這些數字中每個數字的個數。 如果這些數字是整數,那自然可以精確統計出來。 如果這些數字是浮點數,如果精確統計會發現幾乎每個數字都只出現了一次。所以浮點數就要通過區間的方式進行統計。
一、使用collections.Counter
from collections import Counter
import numpy as np
import pylab as plt
a = np.random.randint(0, 10, (100))
c = Counter(a)
x = c.keys()
y = c.values()
plt.plot(x, y, linewidth=5, label="counter")
cnt = np.bincount(a)
plt.plot(range(len(cnt)), cnt, label="numpy")
plt.legend()
plt.show()
二、使用np.bincount
統計整數的出現次數,默認每個整數出現一次就算一次,可以通過weights參數指定每個整數的出現次數。 函數原型:numpy.bincount(x, weights=None, minlength=0) weights表示各個數字的權重,長度和x一致。
import numpy as np
a = np.array([1, 2, 5, 7, 2])
print(np.bincount(a)) #[0 1 2 0 0 1 0 1]
print(np.bincount(a, [0.1, 0.2, 0.5, 0.7, 0.2])) #[0. 0.1 0.4 0. 0. 0.5 0. 0.7]
三、使用np.histogram
使用若干個區間統計浮點數出現次數。 values,edges=numpy.histogram(a, bins=10, range=None, normed=False, weights=None, density=None) 返回的edges和values都是一維數組,edges的長度比values大一個,表示len(values)個間隔。
- a:一個數組,如果是多維會被當做一維數組
- bins:如果是一個int,表示把區間[min,max]均分為bins份;如果是一個數組,表示手動指定各個bins
- range:如果bins是一個int,使用range指定柱狀圖的區間
- weights:可以為每個元素設定權重,默認每個元素權重為1
- normed:已廢棄
- density:bool值
返回值: values就是縱軸,是一個一維數組,表示每個柱子內元素的個數 edges就是橫軸,是一個一維數組,它的長度比values多一維
四、使用np.interp實現插值
y=numpy.interp(x, xp, fp, left=None, right=None, period=None)
- x:一個數組,表示要取哪些地方的插值結果
- xp、fp:x坐標和y坐標
- left、right、period:基本用不上,不必知道
返回值:y插值之后的結果,它的長度和x一樣。 使用此函數可以只繪制一部分坐標而不用全不繪制。matplotlib內部自動會調用插值函數合理繪制圖像,無需手動通過numpy調用,但當向前端傳遞數據讓js完成繪制時,就需要手動調用numpy來進行插值。
實際上,matplotlib這個庫在可視化數據時已經為我們做好了這些工作,如插值等,直接用matplotlib是不需要使用以上函數的。有時,需要將繪圖數據從后端傳到前端用HTML進行展示,這就需要壓縮一下數據,只把展示的數據傳送過來即可。