按bin分组数据数字化

2024-04-23 18:21:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法来平均数据,我在一个数组中的基础上,它离某个像素有多远。为了实现这一点,我制作了一个数组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。你知道吗


Tags: 数据方法距离databinnp像素数组
1条回答
网友
1楼 · 发布于 2024-04-23 18:21:11

这是我的尝试,虽然我想你是在寻找更优雅的东西?:)

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)

相关问题 更多 >