Python:来自2个数组的直方图/分块数据。

Python:来自2个数组的直方图/分块数据。,python,histogram,large-files,Python,Histogram,Large Files,我有两个数据数组:一个是半径值,另一个是该强度下的相应强度读数: e、 g.数据的一小部分。第一列是半径,第二列是强度 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.944

我有两个数据数组:一个是半径值,另一个是该强度下的相应强度读数:

e、 g.数据的一小部分。第一列是半径,第二列是强度

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语句来实现这一点。

非常感谢你的帮助

如果你只需要在少数几点上这样做,你可以这样做

如果
强度
半径
是数据的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.)
bin_width=0.1#取决于您希望您的箱子有多窄
def get_平均值(拉德):

平均强度=强度[(半径>=rad-bin\u宽度/2.)和(radius这并不是对你的目标进行真正的组织编程。直方图更多的是对落入特定箱子中的项目进行计数。你想做的更多的是一组一组的操作,你可以按半径间隔对强度进行分组,并在强度组上应用一些聚合方法,如平均值或中值等

然而,您所描述的内容听起来更像是您想要执行的某种插值。因此,我建议您考虑将插值作为解决问题的替代方案。无论如何,这里有一个建议,说明如何实现您所要求的(假设您可以使用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()
如果可能,请使用或。