使用np.digitize按bin分组数据

时间:2019-03-14 12:52:37

标签: python binning

我正在寻找一种方法,可以根据与某个像素的距离来平均数组中的数据。为此,我制作了一个数组r,其中包含到中心的距离。还有第二个数组data,其中包含可以在该距离的像素中找到的计数。

现在,我已将整个数据集(从0-1150开始)拆分为60个bin,然后将数据数字化以获得一个数组,该数组告诉我哪个值属于哪个bin。

bins = np.linspace(0,60*20, 60)
digitized = np.digitize(rr, bins)

是否存在一种聪明的方法将数字化应用到数据,以使具有相同bin值的所有点平均化?

数组r的形状为380,data相同。因此,最终结果应该是由60个元素组成的数组,该数组具有data中所有合并值的平均值,这取决于分配给digitized的bin。

1 个答案:

答案 0 :(得分:0)

这是我的尝试,尽管我认为您正在寻找更优雅的东西? :)

rr = np.random.randint(0, 15, 1000)
rr_sorted = np.sort(rr)

# Bins
bins = [0, 5, 10, 15]

def assume_sorted_digitized(rr_sorted, bins):
    dig = np.digitize(rr_sorted, bins)
    bin_nr, index = np.unique(dig, return_index=True)
    index_adjusted = np.append(index[1:], len(rr_sorted))
    bin_average = np.zeros_like(bins).astype(np.float32)
    last_idx = 0
    for idx, bin_i in zip(index_adjusted, bin_nr):
        bin_average[bin_i] = rr_sorted[last_idx:idx].mean()
        last_idx = idx
    return bin_average

def nonsorted_digitized(rr, bins):
    dig = np.digitize(rr, bins)
    bin_average = np.zeros_like(bins).astype(np.float32)
    for idx in np.unique(dig):
        bin_average[idx] = rr[dig == idx].mean()
    return bin_average

%timeit assume_sorted_digitized(rr_sorted, bins)
%timeit nonsorted_digitized(rr, bins)

假设已排序,则性能会有所提高

86.5 µs ± 5.49 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
113 µs ± 6.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)