mirror of
https://github.com/boostorg/histogram.git
synced 2026-01-30 20:02:13 +00:00
192 lines
19 KiB
HTML
192 lines
19 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
|
<title>Tutorial</title>
|
|
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
|
|
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
|
<link rel="home" href="../index.html" title="Chapter 1. Boost.Histogram">
|
|
<link rel="up" href="../index.html" title="Chapter 1. Boost.Histogram">
|
|
<link rel="prev" href="introduction.html" title="Introduction">
|
|
<link rel="next" href="notes.html" title="Notes">
|
|
</head>
|
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
|
<table cellpadding="2" width="100%"><tr>
|
|
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
|
|
<td align="center"><a href="../../../../../index.html">Home</a></td>
|
|
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
|
|
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
|
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
|
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
|
|
</tr></table>
|
|
<hr>
|
|
<div class="spirit-nav">
|
|
<a accesskey="p" href="introduction.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="notes.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
|
|
</div>
|
|
<div class="section">
|
|
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
|
<a name="boost_histogram.tutorial"></a><a class="link" href="tutorial.html" title="Tutorial">Tutorial</a>
|
|
</h2></div></div></div>
|
|
<div class="toc"><dl class="toc">
|
|
<dt><span class="section"><a href="tutorial.html#boost_histogram.tutorial.example_1__1d_histogram_in_c__">Example
|
|
1: 1d-histogram in C++</a></span></dt>
|
|
<dt><span class="section"><a href="tutorial.html#boost_histogram.tutorial.example_2__2d_histogram_in_python">Example
|
|
2: 2d-histogram in Python</a></span></dt>
|
|
</dl></div>
|
|
<div class="section">
|
|
<div class="titlepage"><div><div><h3 class="title">
|
|
<a name="boost_histogram.tutorial.example_1__1d_histogram_in_c__"></a><a class="link" href="tutorial.html#boost_histogram.tutorial.example_1__1d_histogram_in_c__" title="Example 1: 1d-histogram in C++">Example
|
|
1: 1d-histogram in C++</a>
|
|
</h3></div></div></div>
|
|
<p>
|
|
How to make a 1d-histogram in C++ and to fill it:
|
|
</p>
|
|
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
|
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">/</span><span class="identifier">axis</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
|
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
|
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cmath</span><span class="special">></span>
|
|
|
|
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">char</span><span class="special">**)</span> <span class="special">{</span>
|
|
<span class="keyword">namespace</span> <span class="identifier">bh</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span>
|
|
|
|
<span class="comment">/* Create a 1-d histogram with an axis that has 10 bins
|
|
* of equal width, covering the real line in the interval
|
|
* [-1.0, 2.0), label it 'x'.
|
|
* Several other binning strategies are supported, see
|
|
* documentation of axis_types.
|
|
*/</span>
|
|
<span class="identifier">bh</span><span class="special">::</span><span class="identifier">histogram</span> <span class="identifier">h</span><span class="special">(</span><span class="identifier">bh</span><span class="special">::</span><span class="identifier">regular_axis</span><span class="special">(</span><span class="number">10</span><span class="special">,</span> <span class="special">-</span><span class="number">1.0</span><span class="special">,</span> <span class="number">2.0</span><span class="special">,</span> <span class="string">"x"</span><span class="special">));</span>
|
|
|
|
<span class="comment">/* Fill histogram with a few entries. Values outside of
|
|
* axis are placed in the overflow and underflow bins.
|
|
* Normally you would loop over a source of values.
|
|
*/</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(-</span><span class="number">1.5</span><span class="special">);</span> <span class="comment">// put in underflow bin</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(-</span><span class="number">0.5</span><span class="special">);</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">1.1</span><span class="special">);</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(-</span><span class="number">1.0</span><span class="special">);</span> <span class="comment">// included, interval is semi-open</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">0.3</span><span class="special">);</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">1.7</span><span class="special">);</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">2.0</span><span class="special">);</span> <span class="comment">// put in overflow bin, interval is semi-open</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="number">20.0</span><span class="special">);</span> <span class="comment">// put in overflow bin</span>
|
|
|
|
<span class="comment">/* Fill histogram with a weighted count. This increases the
|
|
* bin counter not by one, but by the specified weight.
|
|
*
|
|
* This call transparently causes histogram to change it memory
|
|
* layout to store counts as doubles instead of integers. The
|
|
* layout for weighted counts requires up to 16x more memory
|
|
* and will cause inaccuracies of the type a + 1 == a if a is
|
|
* sufficiently large.
|
|
*
|
|
* Use wfill(...) if you have to, else prefer fill(...).
|
|
*/</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">wfill</span><span class="special">(</span><span class="number">0.1</span><span class="special">,</span> <span class="number">5.0</span><span class="special">);</span>
|
|
|
|
<span class="comment">/* Print a table representation of the histogram showing the bin
|
|
* value and a estimate of the standard deviation. Overflow and
|
|
* Underflow bins are accessed naturally as the bins -1 and 10.
|
|
*/</span>
|
|
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">-</span><span class="number">1</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><=</span> <span class="identifier">h</span><span class="special">.</span><span class="identifier">bins</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
|
|
<span class="keyword">const</span> <span class="identifier">bh</span><span class="special">::</span><span class="identifier">regular_axis</span><span class="special">&</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">h</span><span class="special">.</span><span class="identifier">axis</span><span class="special"><</span><span class="identifier">bh</span><span class="special">::</span><span class="identifier">regular_axis</span><span class="special">>(</span><span class="number">0</span><span class="special">);</span>
|
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"bin "</span> <span class="special"><<</span> <span class="identifier">i</span>
|
|
<span class="special"><<</span> <span class="string">" x in ["</span> <span class="special"><<</span> <span class="identifier">a</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">a</span><span class="special">[</span><span class="identifier">i</span><span class="special">+</span><span class="number">1</span><span class="special">]</span> <span class="special"><<</span> <span class="string">"): "</span>
|
|
<span class="special"><<</span> <span class="identifier">h</span><span class="special">.</span><span class="identifier">value</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special"><<</span> <span class="string">" +/- "</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">h</span><span class="special">.</span><span class="identifier">variance</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span>
|
|
<span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
|
|
<span class="special">}</span>
|
|
<span class="special">}</span>
|
|
</pre>
|
|
<p>
|
|
</p>
|
|
<p>
|
|
The program output is:
|
|
</p>
|
|
<p>
|
|
</p>
|
|
<pre class="programlisting">bin -1 x in [-inf, -1): 1 +/- 1
|
|
bin 0 x in [-1, -0.7): 1 +/- 1
|
|
bin 1 x in [-0.7, -0.4): 1 +/- 1
|
|
bin 2 x in [-0.4, -0.1): 0 +/- 0
|
|
bin 3 x in [-0.1, 0.2): 5 +/- 5
|
|
bin 4 x in [0.2, 0.5): 1 +/- 1
|
|
bin 5 x in [0.5, 0.8): 0 +/- 0
|
|
bin 6 x in [0.8, 1.1): 0 +/- 0
|
|
bin 7 x in [1.1, 1.4): 1 +/- 1
|
|
bin 8 x in [1.4, 1.7): 0 +/- 0
|
|
bin 9 x in [1.7, 2): 1 +/- 1
|
|
bin 10 x in [2, inf): 2 +/- 1.41421
|
|
</pre>
|
|
<p>
|
|
</p>
|
|
</div>
|
|
<div class="section">
|
|
<div class="titlepage"><div><div><h3 class="title">
|
|
<a name="boost_histogram.tutorial.example_2__2d_histogram_in_python"></a><a class="link" href="tutorial.html#boost_histogram.tutorial.example_2__2d_histogram_in_python" title="Example 2: 2d-histogram in Python">Example
|
|
2: 2d-histogram in Python</a>
|
|
</h3></div></div></div>
|
|
<p>
|
|
How to make a 2d-histogram in Python and to fill it using a Numpy array:
|
|
</p>
|
|
<p>
|
|
</p>
|
|
<pre class="programlisting"><span class="keyword">import</span> <span class="identifier">histogram</span> <span class="keyword">as</span> <span class="identifier">bh</span>
|
|
<span class="keyword">import</span> <span class="identifier">numpy</span> <span class="keyword">as</span> <span class="identifier">np</span>
|
|
|
|
<span class="comment"># create a 2d-histogram without underflow and overflow bins</span>
|
|
<span class="comment"># for polar coordinates, using a specialized polar_axis for</span>
|
|
<span class="comment"># the binning of the angle 'phi'</span>
|
|
<span class="comment">#</span>
|
|
<span class="comment"># radial axis with label 'radius' has 10 bins from 0.0 to 5.0</span>
|
|
<span class="comment"># polar axis with label 'phi' has 4 bins and a phase of 0.0</span>
|
|
<span class="identifier">h</span> <span class="special">=</span> <span class="identifier">bh</span><span class="special">.</span><span class="identifier">histogram</span><span class="special">(</span><span class="identifier">bh</span><span class="special">.</span><span class="identifier">regular_axis</span><span class="special">(</span><span class="number">10</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="number">5.0</span><span class="special">,</span> <span class="string">"radius"</span><span class="special">,</span>
|
|
<span class="identifier">uoflow</span><span class="special">=</span><span class="identifier">False</span><span class="special">),</span>
|
|
<span class="identifier">bh</span><span class="special">.</span><span class="identifier">polar_axis</span><span class="special">(</span><span class="number">4</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="string">"phi"</span><span class="special">))</span>
|
|
|
|
<span class="comment"># fill histogram with random values, using numpy to make </span>
|
|
<span class="comment"># a two-dimensional normal distribution in cartesian coordinates</span>
|
|
<span class="identifier">x</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">random</span><span class="special">.</span><span class="identifier">randn</span><span class="special">(</span><span class="number">1000</span><span class="special">)</span> <span class="comment"># generate x</span>
|
|
<span class="identifier">y</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">random</span><span class="special">.</span><span class="identifier">randn</span><span class="special">(</span><span class="number">1000</span><span class="special">)</span> <span class="comment"># generate y</span>
|
|
<span class="identifier">rphi</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">empty</span><span class="special">((</span><span class="number">1000</span><span class="special">,</span> <span class="number">2</span><span class="special">))</span>
|
|
<span class="identifier">rphi</span><span class="special">[:,</span> <span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">**</span> <span class="number">2</span> <span class="special">+</span> <span class="identifier">y</span> <span class="special">**</span> <span class="number">2</span><span class="special">)</span> <span class="special">**</span> <span class="number">0.5</span> <span class="comment"># compute radius</span>
|
|
<span class="identifier">rphi</span><span class="special">[:,</span> <span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">arctan2</span><span class="special">(</span><span class="identifier">y</span><span class="special">,</span> <span class="identifier">x</span><span class="special">)</span> <span class="comment"># compute phi</span>
|
|
<span class="identifier">h</span><span class="special">.</span><span class="identifier">fill</span><span class="special">(</span><span class="identifier">rphi</span><span class="special">)</span>
|
|
|
|
<span class="comment"># access counts as a numpy array (no data is copied)</span>
|
|
<span class="identifier">count_matrix</span> <span class="special">=</span> <span class="identifier">np</span><span class="special">.</span><span class="identifier">asarray</span><span class="special">(</span><span class="identifier">h</span><span class="special">)</span>
|
|
|
|
<span class="keyword">print</span> <span class="identifier">count_matrix</span>
|
|
</pre>
|
|
<p>
|
|
The program output are the counts per bin as a 2d-array:
|
|
</p>
|
|
<p>
|
|
</p>
|
|
<pre class="programlisting"><span class="special">[[</span><span class="number">37</span> <span class="number">26</span> <span class="number">33</span> <span class="number">37</span><span class="special">]</span>
|
|
<span class="special">[</span><span class="number">60</span> <span class="number">69</span> <span class="number">76</span> <span class="number">62</span><span class="special">]</span>
|
|
<span class="special">[</span><span class="number">48</span> <span class="number">80</span> <span class="number">80</span> <span class="number">77</span><span class="special">]</span>
|
|
<span class="special">[</span><span class="number">38</span> <span class="number">49</span> <span class="number">45</span> <span class="number">49</span><span class="special">]</span>
|
|
<span class="special">[</span><span class="number">22</span> <span class="number">24</span> <span class="number">20</span> <span class="number">23</span><span class="special">]</span>
|
|
<span class="special">[</span> <span class="number">7</span> <span class="number">9</span> <span class="number">9</span> <span class="number">8</span><span class="special">]</span>
|
|
<span class="special">[</span> <span class="number">3</span> <span class="number">2</span> <span class="number">3</span> <span class="number">3</span><span class="special">]</span>
|
|
<span class="special">[</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span><span class="special">]</span>
|
|
<span class="special">[</span> <span class="number">0</span> <span class="number">1</span> <span class="number">0</span> <span class="number">0</span><span class="special">]</span>
|
|
<span class="special">[</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">0</span><span class="special">]]</span>
|
|
</pre>
|
|
<p>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
|
<td align="left"></td>
|
|
<td align="right"><div class="copyright-footer">Copyright © 2016 Hand Dembinski<p>
|
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
</p>
|
|
</div></td>
|
|
</tr></table>
|
|
<hr>
|
|
<div class="spirit-nav">
|
|
<a accesskey="p" href="introduction.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="notes.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
|
|
</div>
|
|
</body>
|
|
</html>
|