2015-06-22 107 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()