我有大量的数据,我需要获得没有频率最高的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 。这意味着它们的直方图也是一样的。有没有办法删除这些数据?
答案 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()
这是条形图之前和之后:
请注意,现在我可以保存新的直方图,因为我在删除了初始直方图中的最高频率区域后保存了新数据。另外,请注意,初始和最终箱必须等于观察已删除数据的箱柜。