Numpy具有处理此问题的便捷功能:
np.clip。尽管名称听起来像什么,但它不会
删除
值,只是将它们限制在您指定的范围内。基本上,它是内嵌Artem的“脏黑客”。您可以按原样保留值,但是在
hist调用中,只需将数组包装在
np.clip调用中,就像这样
plt.hist(np.clip(values_A, bins[0], bins[-1]), bins=bins)
这样做有很多好处,原因如下:
它的 方式 更快-至少对于大量元素。Numpy在C级别上工作。对python列表进行 *** 作(如Artem的列表理解中所述)对每个元素都有很多开销。基本上,如果您可以选择使用numpy,则应该这样做。
您可以在需要的地方做正确的事,从而减少了在代码中出错的机会。
您不需要保留数组的第二个副本,这可以减少内存使用量(这一行内除外),并进一步减少出错的机会。
使用值
bins[0], bins[-1]
而不是对值进行硬编码可减少再次犯错的机会,因为您可以在bins
定义的位置更改箱。您无需记住在拨打电话clip
或在其他任何地方进行更改。
因此,按照OP中的说明将它们放在一起:
import matplotlib.pyplot as pltimport numpy as npdef plot_histogram_01(): np.random.seed(1) values_A = np.random.choice(np.arange(600), size=200, replace=True) values_B = np.random.choice(np.arange(600), size=200, replace=True) bins = np.arange(0,350,25) fig, ax = plt.subplots(figsize=(9, 5)) _, bins, patches = plt.hist([np.clip(values_A, bins[0], bins[-1]),np.clip(values_B, bins[0], bins[-1])], # normed=1, # normed is deprecated; replace with density density=True, bins=bins, color=['#3782CC', '#AFD5FA'], label=['A', 'B']) xlabels = bins[1:].astype(str) xlabels[-1] += '+' N_labels = len(xlabels) plt.xlim([0, 325]) plt.xticks(25 * np.arange(N_labels) + 12.5) ax.set_xticklabels(xlabels) plt.yticks([]) plt.title('') plt.setp(patches, linewidth=0) plt.legend(loc='upper left') fig.tight_layout()plot_histogram_01()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)