2015-06-22 106 views
1

我有兩組數據:一個是半徑值,另一個是在該強度下的相應強度讀數:一小部分數據。第一列是半徑,第二列是強度。Python:來自2個數組的直方圖/裝箱數據。

29.77036614 0.04464427 29.70281027 0.07771409 29.63523525 0.09424901 29.3639355 1.322793 29.29596385 2.321502 29.22783249 2.415751 29.15969437 1.511504 29.09139827 1.01704 29.02302068 0.9442765 28.95463729 0.3109002 28.88609766 0.162065 28.81754446 0.1356054 28.74883612 0.03637681 28.68004928 0.05952569 28.61125036 0.05291172 28.54229804 0.08432806 28.4732599 0.09950128 28.43877462 0.1091304 28.40421016 0.09629156 28.36961249 0.1193614 28.33500089 0.102711 28.30037503 0.07161685

我斌半徑數據,以及如何才能找到對應於分級半徑平均強度。

這樣做的目的是使用平均強度爲具有缺失(NaN)數據點的半徑數據分配強度值。

我從來沒有使用過直方圖函數,對它們如何工作以及它是否有可能與它們一起做這件事情一無所知。完整的數據集很大,數據點數爲336622個,所以我不想使用循環或if語句來實現這一點。
非常感謝您的任何幫助。

+0

如果可能的話,使用['numpy'(HTTP: //docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html)或['pandas'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame .hist.html)。 – dhke

回答

1

如果你只需要爲少數幾個點做這個,你可以這樣做。

如果intensitesradius是數據的numpy的數組:

bin_width = 0.1 # Depending on how narrow you want your bins 

def get_avg(rad): 
    average_intensity = intensities[(radius>=rad-bin_width/2.) & (radius<rad+bin_width/2.)].mean() 
    return average_intensities 

# This will return the average intensity in the bin: 27.95 <= rad < 28.05 
average = get_avg(28.) 
1

這不是真的你直方圖化是什麼了。直方圖更多的是落入特定垃圾箱的物品的數量。你想要做的更多的是通過組操作,在那裏你會組你的強度由半徑距離和itensities的組應用某些聚合方法,如平均或中位數等

什麼你所描述,然而, ,聽起來更像是你想要執行的某種插值。所以我會建議考慮插值作爲解決您的問題的替代方案。不管怎麼說,這裏有一個建議,如何可以達到你的要求了(假設你可以使用numpy的) - 我用隨機輸入來說明:

radius = numpy.fromiter((random.random() * 10 for i in xrange(1000)), dtype=numpy.float) 
intensities = numpy.fromiter((random.random() * 10 for i in xrange(1000)), dtype=numpy.float) 
# group your radius input into 20 equal distant bins 
bins = numpy.linspace(radius.min(), radius.max(), 20) 
groups = numpy.digitize(radius, bins) 
# groups now holds the index of the bin into which radius[i] falls 
# loop through all bin indexes and select the corresponding intensities 
# perform your aggregation on the selected intensities 
# i'm keeping the aggregation for the group in a dict 
aggregated = {} 
for i in range(len(bins)+1): 
    selected_intensities = intensities[groups==i] 
    aggregated[i] = selected_intensities.mean()