2014-03-02 62 views
5

我有整數列表並希望得到每個整數的頻率。這是討論herePython:發生的頻率

問題是,我使用的方法給我的頻率浮動數字時,我的數據集只包含整數。爲什麼會發生這種情況,以及如何從我的數據中獲取整數的頻率?

我使用pyplot.histogram密謀與出現

import numpy as np 
import matplotlib.pyplot as plt 
from numpy import * 
data = loadtxt('data.txt',dtype=int,usecols=(4,)) #loading 5th column of csv file into array named data. 
plt.hist(data) #plotting the column as histogram 

我得到直方圖的頻率直方圖,但我發現,如果我「打印」的歷史(數據)

hist=np.histogram(data) 
print hist(data) 

我得到這個:

(array([ 2323, 16338, 1587, 212, 26, 14,  3,  2,  2,  2]), 
array([ 1. , 2.8, 4.6, 6.4, 8.2, 10. , 11.8, 13.6, 15.4, 
    17.2, 19. ])) 

當第二陣列代表值和第一陣列代表出現次數。

在我的數據集中,所有值都是整數,第二個數組是如何發生的,第二個數組有浮點數,我應該如何得到整數的頻率?

更新:

這就解決了這個問題,謝謝列夫的回覆。

plt.hist(data, bins=np.arange(data.min(), data.max()+1)) 

爲了避免創建一個新的問題我可以如何繪製每個整數的「在中間」列?再說了,我要爲整數3取空間列2.5,而不是和4 histogram

+1

你確定你使用的是你以爲你是數據?你的評論說第4列,但索引從0開始,所以第4列實際上是第5列。 – daveydave400

+0

是的,它是第五列,錯字。 – user40

+0

我想它應該是'data.max()+ 2'。 'np.arange'沒有上邊框,'bins'包含範圍(元素從0-1,1-2,......) –

回答

10

之間3

如果不指定要使用的窗口之間3.5,np.histogrampyplot.hist將使用默認設置,是使用10個相等的箱子。第一個倉的左邊界是最小的值,最後一個倉的右邊界是最大的。

這就是爲什麼bin邊框是浮點數的原因。您可以使用bins關鍵字參數來執行倉的另一種選擇,如:

plt.hist(data, bins=np.arange(data.min(), data.max()+1)) 

編輯:所有箱轉移到左邊的最簡單的方法可能只是減去所有斌邊界0.5:

plt.hist(data, bins=np.arange(data.min(), data.max()+1)-0.5) 

另一種方式來達到同樣的效果(不相等,如果非整數存在):

plt.hist(data, bins=np.arange(data.min(), data.max()+1), align='left') 
+0

因此,如果我知道不同值的確切數目,我可以將該值放在括號內?如果我不知道,那麼你的建議。我會嘗試。 – user40

+1

@ user40是的,您可以指定任何順序,但請記住它是您提供的_borders_,因此n個bin中有n + 1個。此外,箱子AFAIK之間不能有「空間」,儘管您可以通過指定箱子寬度來使其看起來像有些空間。編輯:我剛剛意識到你說了一些不同的東西。是的,你可以指定一個數字,例如10.這意味着從最小到最大的同等大小的箱子的數量。 –

+0

工作感謝你。但是在情節中,每個bin從一個整數到下一個整數都是完整的值,我如何將這些bin分別表示爲value = 2的1.5到2.5,2個等的2.5-3.5等等。我已經更新了我的問題。 – user40

0

您能給我們ËgroupbyitertoolsHow to count the frequency of the elements in a list?討論:

import numpy sa np 
from itertools import groupby 
freq = {key:len(list(group)) for key, group in groupby(np.sort(data))} 
+0

這是否僅適用於有序列表? – user40

+0

啤酒花,@ user40你是對的,所以它應該排序之前。而且,在詞典中收集結果也很方便。代碼已更新。 – Ondro