【问题标题】:How to reconstruct the raw data from a histogram?如何从直方图中重建原始数据?
【发布时间】:2019-12-08 05:16:02
【问题描述】:

我需要从计时计数器提供的计时直方图中恢复“原始数据”作为 .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]])

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

编辑

我用来加载 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]])

【问题讨论】:

  • 你是如何从 CSV 文件中读取数据的?
  • @HS_nebula 我正在使用 np.loadtxt()
  • 你能告诉我们你的 CSV 是什么样的吗?文件大概有多大?并发布您使用的涉及np.loadtxt()的代码?
  • 我问这个问题是因为我认为问题在于您如何加载数据,这将影响您如何重建直方图。
  • 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]])

标签: python histogram recover raw-data


【解决方案1】:

您可以通过列表理解和 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]))])

【讨论】:

  • 这似乎可行,但我遇到了麻烦,因为我的时间间隔是浮动的。我已经编辑了我发布的代码。我正在努力看看我能用这个做什么。
  • 我已经更新了我的答案。如果您确保将计数转换为int,它将起作用。
【解决方案2】:

特别是如果有大量数据,每次迭代复制数组(这是 append 所做的——numpy 数组无法调整大小)将是昂贵的。尝试先分配(即data = np.zeros(np.size(counts))),然后再分配给它。

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

【讨论】:

  • 最里面的循环用于添加每个时间间隔的适量。例如,4秒的时间间隔发生了34次,所以它需要出现34次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2011-05-13
  • 2021-11-22
  • 2016-04-25
  • 2021-08-01
  • 2022-09-30
相关资源
最近更新 更多