在numpy中移除bin后保存直方图

时间:2016-06-12 14:14:41

标签: python numpy histogram

我有大量的数据,我需要获得没有频率最高的bin的直方图。我使用this来删除这样的bin,但是我需要保存更改的直方图,因为我必须将它与另一个直方图进行比较。我不知道怎么做,因为初始数据没有改变,我只能看到演示文稿的变化。我想以某种方式操纵初始数据以反映直方图中的这种变化(比如删除那些出现在频率最高的bin中的数据),但到目前为止我所尝试的并不起作用。这是一个示例代码,主要基于上面的链接,为了我的目的有一些改变,但不幸的是,这不能完成这项工作:

import numpy as np
import matplotlib.pyplot as plt

gaussian_numbers = np.random.randn(100)

# Get histogram
values, bin_edges = np.histogram(gaussian_numbers, bins=6)
centers = (bin_edges[:-1] + bin_edges[1:]) / 2
width = (bin_edges[1] - bin_edges[0])
plt.bar(centers, values, color="blue",align='center',width=width)
plt.show()

values[np.where(values == np.max(values))] = 0
binCenters =(bin_edges[:-1] + bin_edges[1:]) / 2

plt.bar(binCenters, values, color="blue",align='center', width=width)  
plt.show()

new=gaussian_numbers[(gaussian_numbers!= np.max(values))]
print np.sum(new-gaussian_numbers)

当我绘制条形图时,我可以看到频率最高的bin已被删除。但是,当我尝试从我的数据中删除这些值并将其保存在一个名为new的数组中(然后我想保存 new 的直方图)时, new 和 gaussian_numbers 。这意味着它们的直方图也是一样的。有没有办法删除这些数据?

1 个答案:

答案 0 :(得分:0)

我想我想出了怎么做。基本上,我找到直方图具有最高频率的bin范围,然后将其从原始数据中删除。以下是感兴趣的人的示例代码:

import numpy as np
import matplotlib.pyplot as plt

gaussian_numbers = np.random.randn(100)
print gaussian_numbers.shape
# Get histogram
values, bin_edges = np.histogram(gaussian_numbers, bins=6)
centers = (bin_edges[:-1] + bin_edges[1:]) / 2
width = (bin_edges[1] - bin_edges[0])
plt.bar(centers, values, color="blue",align='center',width=width)
plt.show()


bin_min= bin_edges[np.where(values == np.max(values))]
bin_max= bin_min +width
new_val = gaussian_numbers[(gaussian_numbers<bin_min) | (gaussian_numbers>bin_max)]


values, bin_edges = np.histogram(new_val, bins=6)

centers = (bin_edges[:-1] + bin_edges[1:]) / 2
width = (bin_edges[1] - bin_edges[0])
plt.bar(centers, values, color="blue",align='center',width=width)
plt.show()

这是条形图之前和之后:

enter image description here

enter image description here

请注意,现在我可以保存新的直方图,因为我在删除了初始直方图中的最高频率区域后保存了新数据。另外,请注意,初始和最终箱必须等于观察已删除数据的箱柜。