使用np.digitize按bin分组数据

问题描述 投票:-1回答:1

我正在寻找一种方法来平衡我在数组中的数据,基于它与某个像素的距离。为了达到这个目的,我制作了一个数组r,其中包含到中心的距离。有一个第二个数组data包含可以在该距离的像素中找到的计数。

现在我将整个数据集(从0到1150)拆分为60个箱,然后将数据数字化,得到一个数组,告诉我哪个值属于哪个bin。

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

有没有一种智能的方法将数字化应用于数据,以便具有相同bin值的所有点得到平均值?

阵列r的形状为380,data是相同的。因此,最终结果应该是包含60个元素的数组,这些元素具有data中所有分箱值的平均值,基于哪个分箱被分配给digitized

python binning
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.