如何从直方图中重建原始数据?
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]))])
我需要从计时计数器提供的计时直方图中恢复 "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]))])