我正在寻找一种方法,可以根据与某个像素的距离来平均数组中的数据。为此,我制作了一个数组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。
答案 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)