合并numpy数组中的bin

mf98qq94  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(73)

我有一个保存在数组中的直方图,第一列是bin的最右边,第二列是相应的频率。举例来说:

array([[1.00000000e+00, 9.76765797e-02],
   [2.00000000e+00, 3.26260189e-02],
   [3.00000000e+00, 2.27720518e-03],
   [4.00000000e+00, 1.61188858e-01],
   [5.00000000e+00, 1.23496687e-01],
   [6.00000000e+00, 2.04377586e-01],
   [7.00000000e+00, 7.47678209e-02],
   [8.00000000e+00, 4.67140951e-02],
   [9.00000000e+00, 1.31659099e-01],
   [1.00000000e+01, 1.25216050e-01]])

字符串
什么是最快的方法来重新划分这个直方图,例如,通过采取一个bin大小为2.5
得到的数组应该将2.5,5.0,7.5,10.0作为第一列,将间隔[0,2.5],(2.5,5.0],(5.0,7.5],(5.0,10.]中的频率值之和作为第二列。
我试图找到一种紧凑的方式来进行这种转换,但找不到它。

**编辑:**正如Jakob Stark让我注意到的那样,一般来说,不可能重新划分直方图。然而,可以合并箱。例如,将箱大小加倍或三倍。如何以紧凑的方式做到这一点?

我已经更新了问题的标题以反映编辑。

qkf9rpyu

qkf9rpyu1#

不能对直方图进行重新分组。如果您在直方图中填充数据,您会丢失信息(实际上这通常是您需要直方图的原因)。除非你仍然有原始数据,否则没有办法得到一个不同分箱的直方图。
如果你有原始数据,你当然可以用它制作一个新的直方图。

编辑您可以合并bin。因此,只要您的新bin可以通过合并bin(例如,将bin大小加倍),您可以仅将每个贡献bin的wheights添加到合并bin。
编辑要将bin大小加倍,例如您可以使用

n = 2 # merge 2 bins
bins, weights = old_hist[:,0], old_hist[:,1]
bins = bins.reshape((-1,n))[:,0]
weights = np.sum(weights.reshape((-1,n)), axis=1)
new_hist = np.column_stack((bins,weights))

字符串

raogr8fs

raogr8fs2#

最后,我用这个。不过,恐怕效率不高:

data=array([[1.00000000e+00, 9.76765797e-02],
   [2.00000000e+00, 3.26260189e-02],
   [3.00000000e+00, 2.27720518e-03],
   [4.00000000e+00, 1.61188858e-01],
   [5.00000000e+00, 1.23496687e-01],
   [6.00000000e+00, 2.04377586e-01],
   [7.00000000e+00, 7.47678209e-02],
   [8.00000000e+00, 4.67140951e-02],
   [9.00000000e+00, 1.31659099e-01],
   [1.00000000e+01, 1.25216050e-01]])

bin_size=2.

x=data[:,0]
y=data[:,1]     
nbins=max(x)/bin_size
x_merge=asarray([max(a) for a in array_split(x,nbins)])
y_merge=asarray([sum(a) for a in array_split(y,nbins)])
out_array=column_stack((x_merge,y_merge))

字符串
仍然对更高效/紧凑的方法感兴趣。

6yoyoihd

6yoyoihd3#

我发现使用矢量数学通常是一种更有效的组合箱子的方法。这可以通过使用the indexing features of ndarrays in numpy来实现。下面是上面使用striding(start:stop:step)的例子。

import numpy as np
ar1 = np. array([[1.00000000e+00, 9.76765797e-02],
                 [2.00000000e+00, 3.26260189e-02],
                 [3.00000000e+00, 2.27720518e-03],
                 [4.00000000e+00, 1.61188858e-01],
                 [5.00000000e+00, 1.23496687e-01],
                 [6.00000000e+00, 2.04377586e-01],
                 [7.00000000e+00, 7.47678209e-02],
                 [8.00000000e+00, 4.67140951e-02],
                 [9.00000000e+00, 1.31659099e-01],
                 [1.00000000e+01, 1.25216050e-01]])
bin_size = 2
weights = ar1[::bin_size,1] + ar1[1::bin_size,1]
bins = (ar1[::bin_size,0] + ar1[1::bin_size,0])/bin_size
new_ar = np.column_stack((bins, weights))

字符串

相关问题