如何从直方图中重建原始数据?

How to reconstruct the raw data from a histogram?

我需要从计时计数器提供的计时直方图中恢复 "raw data" 作为 .csv 文件。

我得到了下面的代码,但是由于实际数据在每个 bin 中有几千个计数,for 循环需要很长时间,所以我想知道是否有更好的方法。

import numpy as np

# Example histogram with 1 second bins
hist = np.array([[1., 2., 3., 4., 5., 6., 7., 8., 9., 10.], [0, 17, 3, 34, 35, 100, 101, 107, 12, 1]])

# Array for bins and counts
time_bins = hist[0]
counts = hist[1]

# Empty data to append
data = np.empty(0)

for i in range(np.size(counts)):
    for j in range(counts[i]):
        data = np.append(data, [time_bins[i]])

我知道原始数据的分辨率将是最小的时间段,但这对我的目的来说很好。 最后,这是为了能够生成另一个带有对数箱的直方图,我可以用原始数据来做。

编辑

我用来加载 CSV 的代码是

x = np.loadtxt(fname, delimiter=',', skiprows=1).T 
a = x[0] 
b = x[1] 

data = np.empty(0) 
for i in range(np.size(b)): 
    for j in range(np.int(b[i])): 
        data = np.append(data, [a[i]])

特别是如果有很多数据,每次迭代都复制数组(这就是 append 所做的——numpy 数组不能调整大小)会很昂贵。尝试先分配(即 data = np.zeros(np.size(counts))),然后才分配给它。

我也不确定你最里面的 for 循环在做什么,因为每次迭代都附加相同的东西?

您可以通过列表理解和 numpy 连接来做到这一点:

import numpy as np
hist = np.array([[1., 2., 3., 4., 5., 6., 7., 8., 9., 10.], [0, 17, 3, 34, 35, 100, 101, 107, 12, 1]])
new_array = np.concatenate([[hist[0][i]]*int(hist[1][i]) for i in range(len(hist[0]))])