{"id":396,"date":"2015-08-24T14:10:08","date_gmt":"2015-08-24T14:10:08","guid":{"rendered":"http:\/\/drsfenner.org\/blog\/?p=396"},"modified":"2016-02-05T16:25:34","modified_gmt":"2016-02-05T16:25:34","slug":"game-of-life-in-numpy-2","status":"publish","type":"post","link":"https:\/\/drsfenner.org\/blog\/2015\/08\/game-of-life-in-numpy-2\/","title":{"rendered":"Game of Life in NumPy"},"content":{"rendered":"<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>In a previous post, we explored generating the grid-neighborhoods of an element in a NumPy array. The punch line of that work was <code>grid_nD<\/code>, shown below.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[1]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">numpy<\/span> <span class=\"kn\">as<\/span> <span class=\"nn\">np<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">matplotlib.pyplot<\/span> <span class=\"kn\">as<\/span> <span class=\"nn\">plt<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">time<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">IPython<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">display<\/span>\r\n\r\n<span class=\"o\">%<\/span><span class=\"k\">matplotlib<\/span> inline\r\n\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">numpy.lib.stride_tricks<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">as_strided<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[2]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"k\">def<\/span> <span class=\"nf\">grid_nD<\/span><span class=\"p\">(<\/span><span class=\"n\">arr<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"k\">assert<\/span> <span class=\"nb\">all<\/span><span class=\"p\">(<\/span><span class=\"n\">_len<\/span><span class=\"o\">&gt;<\/span><span class=\"mi\">2<\/span> <span class=\"k\">for<\/span> <span class=\"n\">_len<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">arr<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">)<\/span>\r\n    \r\n    <span class=\"n\">nDims<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">arr<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">newShape<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">_len<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span> <span class=\"k\">for<\/span> <span class=\"n\">_len<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">arr<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"n\">newShape<\/span><span class=\"o\">.<\/span><span class=\"n\">extend<\/span><span class=\"p\">([<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span> <span class=\"o\">*<\/span> <span class=\"n\">nDims<\/span><span class=\"p\">)<\/span>\r\n    \r\n    <span class=\"n\">newStrides<\/span> <span class=\"o\">=<\/span> <span class=\"n\">arr<\/span><span class=\"o\">.<\/span><span class=\"n\">strides<\/span> <span class=\"o\">+<\/span> <span class=\"n\">arr<\/span><span class=\"o\">.<\/span><span class=\"n\">strides<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">as_strided<\/span><span class=\"p\">(<\/span><span class=\"n\">arr<\/span><span class=\"p\">,<\/span> <span class=\"n\">shape<\/span><span class=\"o\">=<\/span><span class=\"n\">newShape<\/span><span class=\"p\">,<\/span> <span class=\"n\">strides<\/span><span class=\"o\">=<\/span><span class=\"n\">newStrides<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><!--more--><\/p>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Using <code>grid_nD<\/code>, coding the game of life becomes really, really easy. Given the neighborhood around a cell, we can simply make use of two lookup tables: (1) the rules to use if the center cell is alive and (2) the rules to use if the center cell is dead. Normally, the Game of Life is implemented with these rules encoded as <code>if-then-else<\/code> or <code>case<\/code> statements. Instead, we&#8217;re going to use <code>np.where<\/code> which allows us to specify an array of boolean values (true\/false, 1\/0, alive\/dead) and then pick from a &quot;true\/1\/alive&quot; value or a &quot;false\/0\/dead&quot; value.<\/p>\n<p>We&#8217;ll create a table of the living values and a table of the dead values in two separate NumPy arrays. For a given number of neighbors, we can lookup the state of the center cell for the next time point.<\/p>\n<p>Recall the rules for a currently living cell:<\/p>\n<ul>\n<li>If I&#8217;m alive and I have fewer than two alive neighors, I die of loneliness.<\/li>\n<li>If I&#8217;m alive and I have two or three alive neighbors, I live.<\/li>\n<li>If I&#8217;m alive and I have more than three alive neighbors, I die of starvation.<\/li>\n<\/ul>\n<p>And for a currently dead cell:<\/p>\n<ul>\n<li>If I&#8217;m dead and I have three (exactly) live neighbors, I become alive by spontaneous combustion.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[3]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"c\"># index is number of neighbors alive<\/span>\r\n<span class=\"n\">ruleOfLifeAlive<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">zeros<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"o\">+<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">uint8<\/span><span class=\"p\">)<\/span>  <span class=\"c\"># default all to dead<\/span>\r\n<span class=\"n\">ruleOfLifeAlive<\/span><span class=\"p\">[[<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">3<\/span><span class=\"p\">]]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span> <span class=\"c\"># alive stays alive &lt;=&gt; 2 or 3 neighbors<\/span>\r\n<span class=\"k\">print<\/span> <span class=\"s\">&quot;ruleOfLifeAlive:&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ruleOfLifeAlive<\/span>\r\n\r\n<span class=\"n\">ruleOfLifeDead<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">zeros<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"o\">+<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">uint8<\/span><span class=\"p\">)<\/span>   <span class=\"c\"># default all to dead<\/span>\r\n<span class=\"n\">ruleOfLifeDead<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>      <span class=\"c\"># dead switches to living &lt;=&gt; 3 neighbors<\/span>\r\n<span class=\"k\">print<\/span> <span class=\"s\">&quot; ruleOfLifeDead:&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ruleOfLifeDead<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_subarea output_stream output_stdout output_text\">\n<pre>ruleOfLifeAlive: [0 0 1 1 0 0 0 0 0]\r\n ruleOfLifeDead: [0 0 0 1 0 0 0 0 0]\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>So, for example a live cell with three neighbors looks up <code>ruleOfLifeAlive[3]<\/code> which has the value <code>1<\/code>, so it stays living. Another dead cell, with five living neighbors looks up <code>ruleOfLifeDead[5]<\/code> and we get the value <code>0<\/code>: it stays dead.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"the-game-of-life\">The Game of Life<\/h3>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>We&#8217;re now ready to implement the Game of Life. We only pull one non-obvious trick. We don&#8217;t want to have a &quot;special case&quot; for the cells on the boarder: we want to count the neighbors by summing up a neighborhood (which can do easily with our <code>grid_nD<\/code> and a NumPy <code>np.sum<\/code> call) and subtracting the center cell value. We do that in line 25 below. With a sequence of <code>axes<\/code>, <code>np.sum(array, axes)<\/code> adds up over multiple axes. For a 2D array, it is the two inner-most axes that pop out from the <code>grid_nD<\/code> call. We can count from inside-out with <code>-1, -2<\/code>.<\/p>\n<p>To prevent the need for &quot;special&quot; (partial) neighborhoods around the boarder, we simply embed our Game of Life board inside of a slightly larger board with <code>0<\/code>s surrounding our main board. NumPy is able to do this in a clever way that makes the inner (main) board a &quot;view&quot; into the outer board so we don&#8217;t have to duplicate memory.<\/p>\n<p>One other pure Python piece you may not have seen is the use of <code>slice<\/code>. When we write <code>arr[1:3, 4:10]<\/code>, the <code>:<\/code> character tells the Python interpreter to create a <code>slice<\/code> object. We can also manually create them. For <code>1:3<\/code>, the slice call looks like <code>slice(1,3)<\/code>. For <code>4:10<\/code>, the call looks like <code>slice(1,4)<\/code>. These are very useful if you have to <em>programmatically<\/em> develop the slice (instead of typing in fixed values and\/or a fixed <em>number of slices<\/em>). If you are unsure of the use-case ofr this, consider what would happen if (1) in one run of a program, you needed 5 dimensions of slicing and (2) in another run of the program, you need only 3 dimensions of slicing. And, extending that, you wanted that program to work in arbitrary dimensions.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[4]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"k\">def<\/span> <span class=\"nf\">imshow_helper<\/span><span class=\"p\">(<\/span><span class=\"n\">board<\/span><span class=\"p\">,<\/span> <span class=\"n\">sleepSeconds<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"sd\">&#39;&#39;&#39; helper method to display a board for short time interval <\/span>\r\n<span class=\"sd\">        being lazy and using the MATLAB style API &#39;&#39;&#39;<\/span>\r\n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">imshow<\/span><span class=\"p\">(<\/span><span class=\"n\">board<\/span><span class=\"p\">,<\/span> <span class=\"n\">cmap<\/span><span class=\"o\">=<\/span><span class=\"s\">&quot;binary&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">interpolation<\/span><span class=\"o\">=<\/span><span class=\"s\">&quot;none&quot;<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s\">&#39;off&#39;<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">display<\/span><span class=\"o\">.<\/span><span class=\"n\">display<\/span><span class=\"p\">(<\/span><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">gcf<\/span><span class=\"p\">())<\/span>\r\n    <span class=\"n\">display<\/span><span class=\"o\">.<\/span><span class=\"n\">clear_output<\/span><span class=\"p\">(<\/span><span class=\"n\">wait<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">time<\/span><span class=\"o\">.<\/span><span class=\"n\">sleep<\/span><span class=\"p\">(<\/span><span class=\"n\">sleepSeconds<\/span><span class=\"p\">)<\/span>\r\n    \r\n<span class=\"k\">class<\/span> <span class=\"nc\">GameOfLife<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">board_size<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">,<\/span><span class=\"mi\">10<\/span><span class=\"p\">)):<\/span>\r\n        <span class=\"n\">full_size<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">tuple<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"o\">+<\/span><span class=\"mi\">2<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">board_size<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">full<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">zeros<\/span><span class=\"p\">(<\/span><span class=\"n\">full_size<\/span><span class=\"p\">,<\/span> <span class=\"n\">dtype<\/span><span class=\"o\">=<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">uint8<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">nd_slice<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nb\">slice<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">),)<\/span> <span class=\"o\">*<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">board_size<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"c\"># self.board = self.full[1:-1,1:-1,...] <\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">full<\/span><span class=\"p\">[<\/span><span class=\"n\">nd_slice<\/span><span class=\"p\">]<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">ndims<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"o\">.<\/span><span class=\"n\">shape<\/span><span class=\"p\">)<\/span>\r\n        \r\n    <span class=\"k\">def<\/span> <span class=\"nf\">run_board<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">N_ITERS<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">10<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"n\">imshow_helper<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"n\">N_ITERS<\/span><span class=\"p\">):<\/span>\r\n            <span class=\"n\">neighborhoods<\/span> <span class=\"o\">=<\/span> <span class=\"n\">grid_nD<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">full<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"c\"># shape = (10,10) --&gt; (-1, -2)<\/span>\r\n            <span class=\"n\">sumOver<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">tuple<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"o\">+<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">xrange<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">ndims<\/span><span class=\"p\">))<\/span>\r\n            <span class=\"n\">neighborCt<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">sum<\/span><span class=\"p\">(<\/span><span class=\"n\">neighborhoods<\/span><span class=\"p\">,<\/span> <span class=\"n\">sumOver<\/span><span class=\"p\">)<\/span> <span class=\"o\">-<\/span> <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span>\r\n            <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[:]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">where<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">,<\/span> \r\n                                     <span class=\"n\">ruleOfLifeAlive<\/span><span class=\"p\">[<\/span><span class=\"n\">neighborCt<\/span><span class=\"p\">],<\/span> \r\n                                     <span class=\"n\">ruleOfLifeDead<\/span><span class=\"p\">[<\/span><span class=\"n\">neighborCt<\/span><span class=\"p\">])<\/span>\r\n            <span class=\"n\">imshow_helper<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"one-quick-board\">One Quick Board<\/h3>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Here&#8217;s one quick board with a square in the lower right. First we look at the raw NumPy array (just the inner array, ignoring the outer array that stores the extra zeros)<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[5]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">gol<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GameOfLife<\/span><span class=\"p\">()<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">5<\/span><span class=\"p\">:<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">:<\/span><span class=\"mi\">8<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"k\">print<\/span> <span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_subarea output_stream output_stdout output_text\">\n<pre>[[0 0 0 0 0 0 0 0 0 0]\r\n [0 0 0 0 0 0 0 0 0 0]\r\n [0 0 0 0 0 0 0 0 0 0]\r\n [0 0 0 0 0 0 0 0 0 0]\r\n [0 0 0 0 0 0 0 0 0 0]\r\n [0 0 0 0 0 1 1 1 0 0]\r\n [0 0 0 0 0 1 1 1 0 0]\r\n [0 0 0 0 0 1 1 1 0 0]\r\n [0 0 0 0 0 0 0 0 0 0]\r\n [0 0 0 0 0 0 0 0 0 0]]\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>And here&#8217;s what that array looks like when we interpret it as an image:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[6]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">imshow<\/span><span class=\"p\">(<\/span><span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">,<\/span> <span class=\"n\">cmap<\/span><span class=\"o\">=<\/span><span class=\"s\">&quot;binary&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">interpolation<\/span><span class=\"o\">=<\/span><span class=\"s\">&quot;none&quot;<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">axis<\/span><span class=\"p\">(<\/span><span class=\"s\">&#39;off&#39;<\/span><span class=\"p\">);<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_png output_subarea \">\n<img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPYAAAD7CAYAAABZjGkWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+\/AAAA1dJREFUeJzt3MFJBEEQQNFud+MzJMGYzMMMPBvFbpuAwgrTDnzfuw4U\nffnUnGqutQbQ8nT2A4DjCRuChA1BwoYgYUOQsCHoesCM1zHGywFzgN95G2M8f\/fBxoYgYUOQsCFI\n2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuC\nhA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAh\nSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkb\ngoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5Cw\nIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJ\nG4KEDUHChiBhQ5CwIUjYECRsCBI2BF3PfgCPWWttmXu5XLbM3WnOuWXu7XbbMvcMNjYECRuChA1B\nwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkCul\/9yu\n66ecy8aGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5Cw\nIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJ\nG4KEDUHChiBhQ5CwIUjYEHQ9+wE8Zs65Ze79ft8yl3PZ2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjY\nECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BrpT+c7uun3IuGxuChA1BwoYgYUOQ\nsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAh6IgrpZ9jjPcD\n5gC\/8\/HTh7nW+suHAH\/ArzgECRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjY\nECRsCBI2BAkbgoQNQcKGoC\/R2xiKdhZA+AAAAABJRU5ErkJggg==\n\"\n>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3 id=\"and-some-2d-boards\">And Some 2D Boards<\/h3>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>Here are a few simple boards (starting configurations) and a few named boards from https:\/\/en.wikipedia.org\/wiki\/Conway%27s_Game_of_Life#Examples_of_patterns<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[7]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">gol<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GameOfLife<\/span><span class=\"p\">()<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">:<\/span><span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">run_board<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_png output_subarea \">\n<img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPYAAAD7CAYAAABZjGkWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+\/AAAAz1JREFUeJzt3EGKwzAQAMHVov\/\/2CgPWB8CkVHorTrmMIjYzRwMGmut\nH6Dl9\/QBgP2EDUHChiBhQ5CwIUjYEDQ3zPC9DM4Zdz\/a2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjY\nECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KE\nDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI\n2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuC\nhA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAh\naJ4+AO9Zaz0yd85nXoHruh6Zy3tsbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKG\nIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgt5T+c0\/dfspZNjYECRuChA1BwoYgYUOQsCFI2BAkbAgS\nNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYg\nYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGoLHW+nTGxwM4Z8Pz\nvzXGeGQuf9z+0TY2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgS\nNgQJG4KEDUHChiBhQ9A8fQDOcptok40NQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI\n2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuC\nhA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ9COsNeGGcBGc8MMWx++jCghSNgQJGwIEjYE\nCRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BL0AQ6gW+vgDMs8A\nAAAASUVORK5CYII=\n\"\n>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[8]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">gol<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GameOfLife<\/span><span class=\"p\">()<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">:<\/span><span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">:<\/span><span class=\"mi\">6<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">6<\/span><span class=\"p\">:<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">:<\/span><span class=\"mi\">8<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">run_board<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_png output_subarea \">\n<img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPYAAAD7CAYAAABZjGkWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+\/AAAA11JREFUeJzt3DFuhEAQAEHvnf\/\/Y1h\/wAEBI3ztqpBghJBaEyDN2nt\/\nAS2vp18AuJ+wIUjYECRsCBI2BAkbgr5vmOF\/GTxn\/fbQxoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHC\nhiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAk\nbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1B\nwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQ\nJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQN\nQd9Pv0DJ3nts9vv9Hpm71hqZexzHyFyusbEhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI2BAkbAgS\nNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbglwp\/RCTF1DpsbEhSNgQJGwIEjYECRuChA1BwoYg\nYUOQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbglwpvdFaa2z2eZ4jc6eun75e\ncztj6jsfxzEy9wk2NgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwI\nEjYECRuChA1BwoYgYUOQsCHI+eEPMXnaeMLUWWOusbEhSNgQJGwIEjYECRuChA1BwoYgYUOQsCFI\n2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbglwp\/eemrp+e5zkyl2tsbAgSNgQJG4KE\nDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuChA1BwoYgV0oZMXX9\nlGtsbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2BAkbgoQNQcKGIGFDkLAhSNgQJGwIEjYECRuC\nhA1BwoagO8LeN8wAbnTH+WFbH\/4YUUKQsCFI2BAkbAgSNgQJG4KEDUHChiBhQ5CwIUjYECRsCBI2\nBAkbgoQNQcKGIGFDkLAhSNgQJGwI+gEllx77qkTRpgAAAABJRU5ErkJggg==\n\"\n>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[9]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">gol<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GameOfLife<\/span><span class=\"p\">((<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span><span class=\"mi\">11<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">]<\/span>    <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">:<\/span><span class=\"mi\">7<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">6<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">run_board<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_png output_subarea \">\n<img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAD7CAYAAABOrvnfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+\/AAAA6NJREFUeJzt3EGK40AQAEFrpf\/\/WPRcdw6GPVSPNZsRV0Mhu520wVDH\nWusFNPz59AMAP0fwECJ4CBE8hAgeQgQPIdfG2f7vg8843r3ghocQwUOI4CFE8BAieAgRPIQIHkIE\nDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE\n8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQq5PP8D\/ZK01Ou88z9F5OxzHMTrvvu\/R\neXznhocQwUOI4CFE8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAh\n5Jjew\/aXbYMrNp7NY03vyIt6+yG64SFE8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAge\nQgQPIYKHEMFDiOAhRPAQIngIETyEXJ9+gH+1Y6Hjdc2+\/fu+R+cVFzpOn\/P0Gb9e8+f8k9zwECJ4\nCBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIRs22m31nr8\nTrYde\/J4Fmf8nRseQgQPIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQI\nHkIEDyGCh5BtwT99nx0UueEhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQIHkIEDyGC\nhxDBQ4jgIUTwECJ4CBE8hBxrrV2ztw2eMv3eLe58nh3f719wzm8f0A0PIYKHEMFDiOAhRPAQIngI\nETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQIHkIEDyGChxDBQ0h6p9206c\/yPM\/ReTtM73e773t0\nXpSddoDgIUXwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BBi\np92DbTybx5rekRdlpx0geEgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAh\nRPAQIngIETyEXJ9+AN6z341pbngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQIHkIEDyGChxDB\nQ4jgIUTwECJ4CBE8hAgeQuy0C1lrjc+0d+93OXZ8CYBn8pMeQgQPIYKHEMFDiOAhRPAQIngIETyE\nCB5CBA8hgocQwUOI4CFE8BAieAgRPIQIHkIEDyGChxDBQ8gXW4ZI7l6SGNoAAAAASUVORK5CYII=\n\"\n>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[10]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">gol<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GameOfLife<\/span><span class=\"p\">((<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span><span class=\"mi\">11<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"mi\">6<\/span><span class=\"p\">]<\/span>   <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">:<\/span><span class=\"mi\">7<\/span><span class=\"p\">,<\/span><span class=\"mi\">5<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span><span class=\"mi\">4<\/span><span class=\"p\">]<\/span>   <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">imshow<\/span><span class=\"p\">(<\/span><span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">,<\/span> <span class=\"n\">cmap<\/span><span class=\"o\">=<\/span><span class=\"s\">&quot;binary&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">interpolation<\/span><span class=\"o\">=<\/span><span class=\"s\">&quot;none&quot;<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt output_prompt\">Out[10]:<\/div>\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>&lt;matplotlib.image.AxesImage at 0x7f099239b1d0&gt;<\/pre>\n<\/div>\n<\/div>\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_png output_subarea \">\n<img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAD7CAYAAABOrvnfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+\/AAACyxJREFUeJzt3W+IZXd9x\/H3xx21bkONpWBq3JIUGrDFghFkaS1e2oUG\nSaMP+kexKtI+MzEEKo19YOZRqQUxQukDTQwpjYpdS2uK1WrrpX1QTNpsyJ\/d\/lGMJhuSSGgE+yi7\n+fbBXJfZzczs5Nxz99zp9\/2CJffeOXPmm8y+53fuuTdnUlVI6uFlUw8g6dIxeKkRg5caMXipEYOX\nGjF4qZGNVe04ia\/3SROpquz0+EpX+Kq66J\/bbrttX9tN+WfdZ1z3+Zzx0s63Fw\/ppUYMXmpk8uBn\ns9nUI1zUus+47vOBM45hjPlysWP+XT8xuQ64HTgE3FFVH7vg4zV035KGS0LtctJuUPBJDgH\/CRwD\nTgP3A++uqlPbtjF4aQJ7BT\/0kP4twLeq6rGqeh74PPCOoQNKujSGBn8l8Pi2+08sHpO0xoYG77G6\ndAANfafdaeDItvtH2Frlz7O5uXnu9mw2W\/uzoNJBNJ\/Pmc\/n+9p26Em7DbZO2v0a8CRwH560k9bC\nXiftBq3wVXUmyY3AV9l6We7O7bFLWk+DX4e\/6I5d4aVJrOJlOUkHkMFLjRi81IjBS40YvNSIwUuN\nGLzUiMFLjRi81IjBS40YvNSIwUuNGLzUiMFLjRi81IjBS40YvNSIwUuNGLzUiMFLjRi81IjBS40Y\nvNSIwUuNGLzUiMFLjRi81IjBS40YvNSIwUuNGLzUiMFLjQwKPsmRJN9I8miSR5J8aOzBJI0vVfXS\nPym5Ariiqh5Mchnw78A7q+rUtm1qyL4lLScJVZWdPjZoha+qp6rqwcXtHwKngNcNH1HSpbD0c\/gk\nVwFvAr657L4krdbGMp+8OJw\/Dty8WOnPs7m5ee72bDZjNpst8+Uk7WA+nzOfz\/e17aDn8ABJXg78\nHfD3VXX7Dh\/3Obw0gb2eww89aRfgbuDZqrpll20MXprAKoJ\/K\/DPwEPAj3bwkar6yrZtDF6awOjB\n7\/OLGrw0gdFflpN0MBm81IjBS40YvNSIwUuNGLzUiMFLjRi81IjBS40YvNSIwUuNGLzUiMFLjRi8\n1IjBS40YvNSIwUuNGLzUiMFLjRi81IjBS40YvNSIwUuNGLzUiMFLjRi81MhSvy5aqzX2r+o6dOjQ\nqPuDrV9rNKazZ8+Ouj+dzxVeasTgpUYMXmrE4KVGDF5qZKngkxxKciLJvWMNJGl1ll3hbwZOAuO+\nfiRpJQYHn+T1wNuBO4BxX4yVtBLLrPCfAD4MvDDSLJJWbNA77ZJcDzxTVSeSzHbbbnNz89zt2WzG\nbLbrppIGms\/nzOfzfW2bIW\/fTPLHwHuBM8CPAT8BfLGq3rdtmxr7raHd+NZaDZGEqtrxGzMo+At2\n\/jbgD6rqNy543OCXZPAaYq\/gx3od3rKlA2DpFX7XHbvCL80VXkNcihVe0gFg8FIjBi81YvBSIwYv\nNeI17UZ0EM6qj+3MmTNTj6CXwBVeasTgpUYMXmrE4KVGDF5qxOClRgxeasTgpUYMXmrE4KVGDF5q\nxOClRgxeasTgpUYMXmrE4KVGDF5qxOClRgxeasRr2o1o7N\/CMvb14jY2xv92j\/3vrNVyhZcaMXip\nEYOXGjF4qRGDlxoZHHySy5McT3IqyckkR8ccTNL4lnmd5pPAl6vqN5NsAD8+0kySViRDfh9aklcD\nJ6rqZ\/fYpsb+XWvdvPDCC6PubxWvw489o5aXhKra8Q0SQw\/prwa+n+SuJA8k+XSSw8NHlHQpDP2R\nvwFcC9xYVfcnuR24Ffjo9o02NzfP3Z7NZsxms4FfTtJu5vM58\/l8X9sOPaS\/AvjXqrp6cf+twK1V\ndf22bTykX5KH9Bpi9EP6qnoKeDzJNYuHjgGPDpxP0iWyzI\/8m4B7krwC+DbwgXFGkrQqgw7p97Vj\nD+mX5iG9hljFWXpJB5DBS40YvNSIwUuNGLzUiMFLjXgRyzX2speN+\/P47Nmzo+5PB48rvNSIwUuN\nGLzUiMFLjRi81IjBS40YvNSIwUuNGLzUiMFLjRi81IjBS40YvNSIwUuNGLzUiMFLjRi81IjBS40Y\nvNSI17RrJNnxtw+pEVd4qRGDlxoxeKkRg5caMXipkcHBJ7klySNJHk7y2SSvHHMwSeMbFHySK4Gb\ngDdX1RuBQ8C7xhxM0viWeR1+Azic5CxwGDg9zkiSVmXQCl9Vp4GPA98DngSeq6qvjzmYpPENWuGT\nvAa4AbgK+AHwV0neU1X3bN9uc3Pz3O3ZbMZsNhs6p6RdzOdz5vP5vrZNVb3kL5Dkt4Bfr6rfX9x\/\nL3C0qj64bZsasm9Jy0lCVe34PuqhZ+m\/CxxN8qpsvUH7GHBy6ICSLo2hz+HvA44DDwAPLR7+1FhD\nSVqNQYf0+9qxh\/TSJFZxSC\/pADJ4qRGDlxoxeKkRg5caMXipEYOXGjF4qRGDlxoxeKkRg5caMXip\nEYOXGjF4qRGDlxoxeKkRg5caMXipEYOXGjF4qRGDlxoxeKkRg5caMXipEYOXGjF4qRGDlxoxeKkR\ng5caMXipEYOXGtkz+CSfSfJ0koe3PfaTSb6W5L+S\/EOSy1c\/pqQxXGyFvwu47oLHbgW+VlXXAP+4\nuC\/pANgz+Kr6F+B\/Lnj4BuDuxe27gXeuYC5JKzDkOfxrq+rpxe2ngdeOOI+kFVrqpF1VFVAjzSJp\nxTYGfM7TSa6oqqeS\/DTwzG4bbm5unrs9m82YzWYDvpykvcznc+bz+b62zdYivccGyVXAvVX1xsX9\nPwWeraqPJbkVuLyqXnTiLkldbN+SxpeEqsqOH9sryiSfA94G\/BRbz9c\/Cvwt8AXgZ4DHgN+uqud2\n+FyDlyYwOPglv6jBSxPYK3jfaSc1YvBSI5MHv9+zi1Na9xnXfT5wxjGMMZ\/B78O6z7ju84EzjuH\/\nRfCSLh2DlxpZ6ctyK9mxpIu65K\/DS1o\/HtJLjRi81MikwSe5Lsl\/JPnvJH845SwXSnIkyTeSPJrk\nkSQfmnqm3SQ5lOREknunnuVCSS5PcjzJqSQnkxydeqYLJbll8T1+OMlnk7xyDWZayeXlJgs+ySHg\nz9i6hNbPA+9O8oap5tnB88AtVfULwFHgg2s233Y3AydZz2sTfBL4clW9AfhF4NTE85wnyZXATcCb\nF\/9H6CHgXdNOBazo8nJTrvBvAb5VVY9V1fPA54F3TDjPearqqap6cHH7h2z9RX3dtFO9WJLXA28H\n7gB2PDM7lSSvBn6lqj4DUFVnquoHE4+1kw3gcJIN4DBweuJ5VnZ5uSmDvxJ4fNv9JxaPrZ3FNQHe\nBHxz2kl29Angw8ALUw+yg6uB7ye5K8kDST6d5PDUQ21XVaeBjwPfA54Enquqr0871a6WvrzclMGv\n4+HniyS5DDgO3LxY6ddGkuuBZ6rqBGu2ui9sANcCf15V1wL\/y5pd5TjJa9haOa9i6wjusiTvmXSo\nfRh6ebkpgz8NHNl2\/whbq\/zaSPJy4IvAX1bV30w9zw5+CbghyXeAzwG\/muQvJp5puyeAJ6rq\/sX9\n42z9AFgnx4DvVNWzVXUG+Gu2\/ruuo6eTXAFwscvL7WbK4P8N+LkkVyV5BfA7wJcmnOc8SQLcCZys\nqtunnmcnVfVHVXWkqq5m60TTP1XV+6ae60eq6ing8STXLB46Bjw64Ug7+S5wNMmrFt\/zY2ydAF1H\nXwLev7j9fuAlL0JDLmI5iqo6k+RG4KtsnRm9s6rW6QzuLwO\/CzyU5MTisY9U1VcmnOli1vFp0k3A\nPYsf6t8GPjDxPOepqvuSHAceAM4s\/vmpaac6\/\/JySR5n6\/JyfwJ8Icnvsbi83Ever2+tlfrwnXZS\nIwYvNWLwUiMGLzVi8FIjBi81YvBSIwYvNfJ\/gorJmWxS7Y0AAAAASUVORK5CYII=\n\"\n>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[11]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">run_board<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_png output_subarea \">\n<img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAD7CAYAAABOrvnfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+\/AAAA5JJREFUeJzt3MFq60AQAEGtrP\/\/Ysubay4Oj8cqcuiqq2FYMO05GGbM\nOTegYb\/7AcDvETyECB5CBA8hgocQwUPIceFs\/\/fBPca7D2x4CBE8hAgeQgQPIYKHEMFDiOAhRPAQ\nIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQP\nIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTw\nECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5Cjrsf8K\/mnMtnPh6PpfPGGEvnnee5dB7Y\n8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5C\nLjtiufro5OqDk1d4Pp93PwF+ZMNDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQI\nHkIEDyGChxDBQ4jgIUTwEDJW3577Zung1+u1cty2bevv5O372t\/P8zyXziNjvPvAhocQwUOI4CFE\n8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAh5M\/ctLvC6jt5q2\/k\njfH2NNlHzNs2d\/c+lJt2gOAhRfAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQIHkIEDyGC\nhxDBQ4jgIUTwECJ4CDnufsCd9n3t793qo5irD4weR\/rrZrPhIUXwECJ4CBE8hAgeQgQPIYKHEMFD\niOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAhx5GyhMcbdT4Af2fAQIngIETyECB5CBA8h\ngocQwUOI4CFE8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hIw551WzLxvM\/7niu3bH7yO9\n\/VJseAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5C\njrsfwO9xfw4bHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5C\nBA8hgocQwUPIlUcsXUyED2PDQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5C\nBA8hgocQwUOI4CFE8BAieAj5AiyZMv9xOVycAAAAAElFTkSuQmCC\n\"\n>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[12]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">gol<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GameOfLife<\/span><span class=\"p\">((<\/span><span class=\"mi\">11<\/span><span class=\"p\">,<\/span><span class=\"mi\">11<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">7<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">:<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">:<\/span><span class=\"mi\">9<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n\r\n<span class=\"n\">plt<\/span><span class=\"o\">.<\/span><span class=\"n\">imshow<\/span><span class=\"p\">(<\/span><span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">board<\/span><span class=\"p\">,<\/span> <span class=\"n\">cmap<\/span><span class=\"o\">=<\/span><span class=\"s\">&quot;binary&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">interpolation<\/span><span class=\"o\">=<\/span><span class=\"s\">&quot;none&quot;<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt output_prompt\">Out[12]:<\/div>\n<div class=\"output_text output_subarea output_execute_result\">\n<pre>&lt;matplotlib.image.AxesImage at 0x7f09922dd550&gt;<\/pre>\n<\/div>\n<\/div>\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_png output_subarea \">\n<img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAD7CAYAAABOrvnfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+\/AAAC15JREFUeJzt3V+MpXddx\/H3pzuArI0UY8JKWbM1sQkaNJSEbETDUTex\nIbVw4R8I\/0L0jpamicTqBZ0rIyaEkhgvoKXByJ\/gYpQaFEE5iReGVrsNbXf9A6Gw3Wa3hNgmeNXt\nfr2Yw2Z2OzM7feY5+5zx+34lm55z5plnvrtn3\/t7znOmz6SqkNTDNVMPIOnqMXipEYOXGjF4qRGD\nlxoxeKmRtWXtOInv90kTqaps9fhSV\/iquuKvu+++e1fbTflr1Wdc9fmc8erOtxMP6aVGDF5qZPLg\nZ7PZ1CNc0arPuOrzgTOOYYz5cqVj\/m0\/MbkZuAc4ANxbVR++7OM1dN+ShktCbXPSblDwSQ4A\/wkc\nA84ADwHvqKpTm7YxeGkCOwU\/9JD+jcA3q+qJqnoO+Bzw1qEDSro6hgZ\/PXB60\/0nF49JWmFDg\/dY\nXdqHhn6n3Rng8Kb7h9lY5S+xvr5+8fZsNlv5s6DSfjSfz5nP57vaduhJuzU2Ttr9GvAU8CCetJNW\nwk4n7Qat8FV1PsltwJfZeFvuvs2xS1pNg9+Hv+KOXeGlSSzjbTlJ+5DBS40YvNSIwUuNGLzUiMFL\njSztmnbqYey3XtfWxv0r+fzzz4+6v\/3OFV5qxOClRgxeasTgpUYMXmrE4KVGDF5qxOClRgxeasTg\npUYMXmrE4KVGDF5qxOClRgxeasTgpUYMXmrE4KVGDF5qZKnXtBvzemcHDhwYbV8\/lGz503gG63j9\ntLH\/DM+fPz\/q\/nQpV3ipEYOXGjF4qRGDlxoxeKmRQcEnOZzka0keT\/JYkg+MPZik8WXIW2dJDgGH\nquqRJNcC\/w68rapObdqmLly4MNqgvi3Xw9g\/umrs53g\/SEJVbfkbH7TCV9XZqnpkcfsHwCng1cNH\nlHQ17Pk1fJIjwOuBr+91X5KWa0\/fabc4nD8O3LFY6S+xvr5+8fZsNmM2m+3ly0nawnw+Zz6f72rb\nQa\/hAZK8BPg74O+r6p4tPu5reL1ovobfu9Ffw2fjT\/E+4ORWsUtaTUNfw78JeBfwK0lOLH7dPOJc\nkpZg8CH9FXfsIb0G8JB+70Y\/pJe0Pxm81IjBS40YvNSIwUuNLPWadmOeIV3Gtc7W1pb62185y3hH\nZhnvnoxpGWfp9\/O7Ma7wUiMGLzVi8FIjBi81YvBSIwYvNWLwUiMGLzVi8FIjBi81YvBSIwYvNWLw\nUiMGLzVi8FIjBi81YvBSIwYvNWLwUiMGLzWyb67ieM014\/\/btJ8vRjiEF3SUK7zUiMFLjRi81IjB\nS40YvNTInoJPciDJiSQPjDWQpOXZ6wp\/B3ASGP+Hlkka3eDgk7wGeAtwLzD+G7ySRreXFf6jwAeB\nCyPNImnJBn2nXZJbgKer6kSS2Xbbra+vX7w9m82YzbbdVNJA8\/mc+Xy+q20z5GeGJ\/lj4N3AeeBH\ngB8DvlBV79m0TS3j55GPaez5lvGtq6tu1Z\/jZVj15zkJVbXlkIOCv2znbwZ+v6p+47LHDb6BVX+O\nl2HVn+edgh\/rffh+z7q0D+15hd92x67wLaz6c7wMq\/48X40VXtI+YPBSIwYvNWLwUiMGLzWyb65p\ntwyrfrZ1P\/DPcH9xhZcaMXipEYOXGjF4qRGDlxoxeKkRg5caMXipEYOXGjF4qRGDlxoxeKkRg5ca\nMXipEYOXGjF4qRGDlxoxeKkRg5caMXipEYOXGjF4qRGDlxoxeKkRg5caGRx8kuuSHE9yKsnJJEfH\nHEzS+Pbyo6Y+Bnypqn4zyRrwoyPNJGlJUlUv\/pOSVwAnquqnd9imhuxb0t4koaq2\/KF\/Qw\/pbwC+\nl+T+JA8n+USSg8NHlHQ1DD2kXwNuAm6rqoeS3APcBXxo80br6+sXb89mM2az2cAvJ2k78\/mc+Xy+\nq22HHtIfAv61qm5Y3P8l4K6qumXTNh7SSxMY\/ZC+qs4Cp5PcuHjoGPD4wPkkXSWDVniAJL8A3Au8\nFPgW8L6qenbTx13hpQnstMIPDn4XX9TgpQks4yy9pH3I4KVGDF5qxOClRgxeasTgpUYMXmrE4KVG\nDF5qxOClRgxeasTgpUYMXmrE4KVGDF5qxOClRgxeasTgpUYMXmrE4KVGDF5qxOClRgxeasTgpUYM\nXmrE4KVGDF5qxOClRgxeasTgpUYMXmrE4KVGBgef5M4kjyV5NMlnkrxszMEkjW9Q8EmuB24H3lBV\nrwMOAG8fczBJ41vb4+ceTPI8cBA4M85IkpZl0ApfVWeAjwDfBZ4Cnqmqr445mKTxDVrhk7wSuBU4\nAjwL\/FWSd1bVpzdvt76+fvH2bDZjNpsNnVPSNubzOfP5fFfbpqpe9BdI8lvAr1fV7y3uvxs4WlXv\n37RNDdm3pL1JQlVlq48NPUv\/HeBokpcnCXAMODl0QElXx9DX8A8Cx4GHgW8sHv74WENJWo5Bh\/S7\n2rGH9NIklnFIL2kfMnipEYOXGjF4qRGDlxoxeKkRg5caMXipEYOXGjF4qRGDlxoxeKkRg5caMXip\nEYOXGjF4qRGDlxoxeKkRg5caMXipEYOXGjF4qRGDlxoxeKkRg5caMXipEYOXGjF4qRGDlxoxeKkR\ng5ca2TH4JJ9Mci7Jo5se+\/EkX0nyX0n+Mcl1yx9T0hiutMLfD9x82WN3AV+pqhuBf1rcl7QP7Bh8\nVf0L8D+XPXwr8KnF7U8Bb1vCXJKWYMhr+FdV1bnF7XPAq0acR9IS7emkXVUVUCPNImnJ1gZ8zrkk\nh6rqbJKfBJ7ebsP19fWLt2ezGbPZbMCXk7ST+XzOfD7f1bbZWKR32CA5AjxQVa9b3P9T4PtV9eEk\ndwHXVdULTtwlqSvtW9L4klBV2fJjO0WZ5LPAm4GfYOP1+oeAvwU+D\/wU8ATw21X1zBafa\/DSBAYH\nv8cvavDSBHYK3u+0kxoxeKmRyYPf7dnFKa36jKs+HzjjGMaYz+B3YdVnXPX5wBnH8P8ieElXj8FL\njSz1bbml7FjSFV319+ElrR4P6aVGDF5qZNLgk9yc5D+S\/HeSP5hylsslOZzka0keT\/JYkg9MPdN2\nkhxIciLJA1PPcrkk1yU5nuRUkpNJjk490+WS3Ll4jh9N8pkkL1uBmZZyebnJgk9yAPgzNi6h9bPA\nO5K8dqp5tvAccGdV\/RxwFHj\/is232R3ASVbz2gQfA75UVa8Ffh44NfE8l0hyPXA78IbF\/xF6AHj7\ntFMBS7q83JQr\/BuBb1bVE1X1HPA54K0TznOJqjpbVY8sbv+Ajb+or552qhdK8hrgLcC9wJZnZqeS\n5BXAL1fVJwGq6nxVPTvxWFtZAw4mWQMOAmcmnmdpl5ebMvjrgdOb7j+5eGzlLK4J8Hrg69NOsqWP\nAh8ELkw9yBZuAL6X5P4kDyf5RJKDUw+1WVWdAT4CfBd4Cnimqr467VTb2vPl5aYMfhUPP18gybXA\nceCOxUq\/MpLcAjxdVSdYsdV9YQ24CfjzqroJ+F9W7CrHSV7Jxsp5hI0juGuTvHPSoXZh6OXlpgz+\nDHB40\/3DbKzyKyPJS4AvAH9ZVX8z9Txb+EXg1iTfBj4L\/GqSv5h4ps2eBJ6sqocW94+z8Q\/AKjkG\nfLuqvl9V54G\/ZuPPdRWdS3II4EqXl9vOlMH\/G\/AzSY4keSnwO8AXJ5znEkkC3AecrKp7pp5nK1X1\nR1V1uKpuYONE0z9X1XumnuuHquoscDrJjYuHjgGPTzjSVr4DHE3y8sVzfoyNE6Cr6IvAexe33wu8\n6EVoyEUsR1FV55PcBnyZjTOj91XVKp3BfRPwLuAbSU4sHvvDqvqHCWe6klV8mXQ78OnFP+rfAt43\n8TyXqKoHkxwHHgbOL\/778WmnuvTycklOs3F5uT8BPp\/kd1lcXu5F79dvrZX68DvtpEYMXmrE4KVG\nDF5qxOClRgxeasTgpUYMXmrk\/wDF08sEp2IUAgAAAABJRU5ErkJggg==\n\"\n>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"prompt input_prompt\">In&nbsp;[13]:<\/div>\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-ipython2\">\n<pre><span class=\"n\">gol<\/span><span class=\"o\">.<\/span><span class=\"n\">run_board<\/span><span class=\"p\">(<\/span><span class=\"mi\">50<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"output_wrapper\">\n<div class=\"output\">\n<div class=\"output_area\">\n<div class=\"prompt\"><\/div>\n<div class=\"output_png output_subarea \">\n<img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAD7CAYAAABOrvnfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+\/AAAA\/lJREFUeJzt3Ttu3EAQQEHS5BF0\/yPqBLukI8NO5MDokVZ+VamABn8P\nEyzQ2u\/73oCGH199AcDnETyECB5CBA8hgocQwUPIuXC23\/vga+wf\/cEJDyGChxDBQ4jgIUTwECJ4\nCBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUPIsuD9Cyt4PU54CBE8hAgeQgQP\nIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQIHkLstIMQJzyECB5CBA8h\ngocQwUOI4CFE8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIfuq3XNvb2\/3+\/v7\n2Lx938dm\/fJ8PsdnvrIV7\/o4jtF50+\/58XiMztu2+Xuedl3Xhw\/RCQ8hgocQwUOI4CFE8BAieAgR\nPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAh5Fw1+L7vJUsTJ01f33nOPs7p\nJZsrFoFOL4mcfoYrvPp3\/TdOeAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFD\niOAhRPAQIngIETyECB5CXn+B2Dcyvetset5xHKPztm1+T9532ON3Xdf4zM\/ihIcQwUOI4CFE8BAi\neAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhZJ\/em\/bLvWrwoOl9Z9O3\nPH19K3axnefsWsTvvC\/uhXz44TjhIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5C\nBA8hgocQwUOI4CFE8BAieAgRPIQsW2K5bdvLL7GcvvfjOEbnTS+xfD6fo\/O27fUXd0ZZYgkIHlIE\nDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5CBA8h51dfwP9k4X7A\nESuu7zxnP6EVe\/f4zQkPIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFE8BAieAgRPIQI\nHkIEDyGChxDBQ0h6p92+76PzrusanTe9g256\/9y2bdvj8RifyTpOeAgRPIQIHkIEDyGChxDBQ4jg\nIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5C9um9aX9YNph\/s+JdT+8FZMSHL8UJ\nDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQIngIETyECB5CBA8hgocQwUOI4CFk\n5RJL4MU44SFE8BAieAgRPIQIHkIEDyGChxDBQ4jgIUTwECJ4CBE8hAgeQgQPIYKHEMFDiOAhRPAQ\nIngIETyE\/AQKjHXOpoTQ1wAAAABJRU5ErkJggg==\n\"\n>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3>\nAdditional Resources<br \/>\n<\/h3>\n<p>\nYou can grab a <a href=\"http:\/\/drsfenner.org\/public\/notebooks\/GameOfLife.ipynb\">copy of this notebook<\/a>.\n<\/p>\n<p>\nEven better, you can <a href=\"http:\/\/nbviewer.ipython.org\/url\/drsfenner.org\/public\/notebooks\/GameOfLife.ipynb\">view it using nbviewer<\/a>.\n<\/p>\n<h3>\nLicense<br \/>\n<\/h3>\n<p>\nUnless otherwise noted, the contents of this notebook are under the following license. The code in the notebook should be considered part of the text (i.e., licensed and treated as as follows).\n<\/p>\n<p><a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/\"><img decoding=\"async\" alt=\"Creative Commons License\" style=\"border-width:0\" src=\"https:\/\/i.creativecomm\nons.org\/l\/by-nc-sa\/4.0\/88x31.png\" \/><\/a><br \/><span xmlns:dct=\"http:\/\/purl.org\/dc\/terms\/\" property=\"dct:title\">DrsFenner.org Blog And Notebooks<\/span> by <a xmln\ns:cc=\"http:\/\/creativecommons.org\/ns#\" href=\"drsfenner.org\" property=\"cc:attributionName\" rel=\"cc:attributionURL\">Mark and Barbara Fenner<\/a> is licensed under a <a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/\">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License<\/a>.&lt; br\/&gt;Permissions beyond the scope of this license may be available at <a xmlns:cc=\"http:\/\/creativecommons.org\/ns#\" href=\"drsfenner.org\/blog\/about-and-contacts\" r\nel=\"cc:morePermissions\">drsfenner.org\/blog\/about-and-contacts<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"prompt input_prompt\">\n<\/div>\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<h3>\nAdditional Resources<br \/>\n<\/h3>\n<p>\nYou can grab a <a href=\"http:\/\/drsfenner.org\/public\/notebooks\/GameOfLife.ipynb\">copy of this notebook<\/a>.\n<\/p>\n<p>\nEven better, you can <a href=\"http:\/\/nbviewer.ipython.org\/url\/drsfenner.org\/public\/notebooks\/GameOfLife.ipynb\">view it using nbviewer<\/a>.\n<\/p>\n<h3>\nLicense<br \/>\n<\/h3>\n<p>\nUnless otherwise noted, the contents of this notebook are under the following license. The code in the notebook should be considered part of the text (i.e., licensed and treated as as follows).\n<\/p>\n<p><a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/\"><img decoding=\"async\" alt=\"Creative Commons License\" style=\"border-width:0\" src=\"https:\/\/i.creativecommons.org\/l\/by-nc-sa\/4.0\/88x31.png\" \/><\/a><br \/><span xmlns:dct=\"http:\/\/purl.org\/dc\/terms\/\" property=\"dct:title\">DrsFenner.org Blog And Notebooks<\/span> by <a xmlns:cc=\"http:\/\/creativecommons.org\/ns#\" href=\"drsfenner.org\" property=\"cc:attributionName\" rel=\"cc:attributionURL\">Mark and Barbara Fenner<\/a> is licensed under a <a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/\">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License<\/a>.<br \/>Permissions beyond the scope of this license may be available at <a xmlns:cc=\"http:\/\/creativecommons.org\/ns#\" href=\"drsfenner.org\/blog\/about-and-contacts\" rel=\"cc:morePermissions\">drsfenner.org\/blog\/about-and-contacts<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In a previous post, we explored generating the grid-neighborhoods of an element in a NumPy array. The punch line of that work was grid_nD, shown below. In&nbsp;[1]: import numpy as np import matplotlib.pyplot as plt import time from IPython import display %matplotlib inline from numpy.lib.stride_tricks import as_strided In&nbsp;[2]: def grid_nD(arr): assert all(_len&gt;2 for _len in [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,7],"tags":[],"class_list":["post-396","post","type-post","status-publish","format-standard","hentry","category-mrdr","category-sci-math-stat-python"],"_links":{"self":[{"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/posts\/396","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/comments?post=396"}],"version-history":[{"count":2,"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/posts\/396\/revisions"}],"predecessor-version":[{"id":423,"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/posts\/396\/revisions\/423"}],"wp:attachment":[{"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/media?parent=396"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/categories?post=396"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/drsfenner.org\/blog\/wp-json\/wp\/v2\/tags?post=396"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}