Iteration.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. ---
  2. redirect_from:
  3. - "/chapters/09/2/iteration"
  4. interact_link: content/chapters/09/2/Iteration.ipynb
  5. kernel_name: python3
  6. has_widgets: false
  7. title: |-
  8. Iteration
  9. prev_page:
  10. url: /chapters/09/1/Conditional_Statements.html
  11. title: |-
  12. Conditional Statements
  13. next_page:
  14. url: /chapters/09/3/Simulation.html
  15. title: |-
  16. Simulation
  17. comment: "***PROGRAMMATICALLY GENERATED, DO NOT EDIT. SEE ORIGINAL FILES IN /content***"
  18. ---
  19. <div class="jb_cell tag_remove_input">
  20. <div class="cell border-box-sizing code_cell rendered">
  21. </div>
  22. </div>
  23. <div class="jb_cell">
  24. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  25. <div class="text_cell_render border-box-sizing rendered_html">
  26. <h3 id="Iteration">Iteration<a class="anchor-link" href="#Iteration"> </a></h3><p>It is often the case in programming – especially when dealing with randomness – that we want to repeat a process multiple times. For example, recall the game of betting on one roll of a die with the following rules:</p>
  27. <ul>
  28. <li>If the die shows 1 or 2 spots, my net gain is -1 dollar.</li>
  29. <li>If the die shows 3 or 4 spots, my net gain is 0 dollars.</li>
  30. <li>If the die shows 5 or 6 spots, my net gain is 1 dollar.</li>
  31. </ul>
  32. <p>The function <code>bet_on_one_roll</code> takes no argument. Each time it is called, it simulates one roll of a fair die and returns the net gain in dollars.</p>
  33. </div>
  34. </div>
  35. </div>
  36. </div>
  37. <div class="jb_cell">
  38. <div class="cell border-box-sizing code_cell rendered">
  39. <div class="input">
  40. <div class="inner_cell">
  41. <div class="input_area">
  42. <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">bet_on_one_roll</span><span class="p">():</span>
  43. <span class="sd">&quot;&quot;&quot;Returns my net gain on one bet&quot;&quot;&quot;</span>
  44. <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</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="c1"># roll a die once and record the number of spots</span>
  45. <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="mi">2</span><span class="p">:</span>
  46. <span class="k">return</span> <span class="o">-</span><span class="mi">1</span>
  47. <span class="k">elif</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="mi">4</span><span class="p">:</span>
  48. <span class="k">return</span> <span class="mi">0</span>
  49. <span class="k">elif</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="mi">6</span><span class="p">:</span>
  50. <span class="k">return</span> <span class="mi">1</span>
  51. </pre></div>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. <div class="jb_cell">
  58. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  59. <div class="text_cell_render border-box-sizing rendered_html">
  60. <p>Playing this game once is easy:</p>
  61. </div>
  62. </div>
  63. </div>
  64. </div>
  65. <div class="jb_cell">
  66. <div class="cell border-box-sizing code_cell rendered">
  67. <div class="input">
  68. <div class="inner_cell">
  69. <div class="input_area">
  70. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">bet_on_one_roll</span><span class="p">()</span>
  71. </pre></div>
  72. </div>
  73. </div>
  74. </div>
  75. <div class="output_wrapper">
  76. <div class="output">
  77. <div class="jb_output_wrapper }}">
  78. <div class="output_area">
  79. <div class="output_text output_subarea output_execute_result">
  80. <pre>1</pre>
  81. </div>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. </div>
  87. </div>
  88. <div class="jb_cell">
  89. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  90. <div class="text_cell_render border-box-sizing rendered_html">
  91. <p>To get a sense of how variable the results are, we have to play the game over and over again. We could run the cell repeatedly, but that's tedious, and if we wanted to do it a thousand times or a million times, forget it.</p>
  92. <p>A more automated solution is to use a <code>for</code> statement to loop over the contents of a sequence. This is called <em>iteration</em>. A <code>for</code> statement begins with the word <code>for</code>, followed by a name we want to give each item in the sequence, followed by the word <code>in</code>, and ending with an expression that evaluates to a sequence. The indented body of the <code>for</code> statement is executed once <em>for each item in that sequence</em>.</p>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. <div class="jb_cell">
  98. <div class="cell border-box-sizing code_cell rendered">
  99. <div class="input">
  100. <div class="inner_cell">
  101. <div class="input_area">
  102. <div class=" highlight hl-ipython3"><pre><span></span><span class="k">for</span> <span class="n">animal</span> <span class="ow">in</span> <span class="n">make_array</span><span class="p">(</span><span class="s1">&#39;cat&#39;</span><span class="p">,</span> <span class="s1">&#39;dog&#39;</span><span class="p">,</span> <span class="s1">&#39;rabbit&#39;</span><span class="p">):</span>
  103. <span class="nb">print</span><span class="p">(</span><span class="n">animal</span><span class="p">)</span>
  104. </pre></div>
  105. </div>
  106. </div>
  107. </div>
  108. <div class="output_wrapper">
  109. <div class="output">
  110. <div class="jb_output_wrapper }}">
  111. <div class="output_area">
  112. <div class="output_subarea output_stream output_stdout output_text">
  113. <pre>cat
  114. dog
  115. rabbit
  116. </pre>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. <div class="jb_cell">
  125. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  126. <div class="text_cell_render border-box-sizing rendered_html">
  127. <p>It is helpful to write code that exactly replicates a <code>for</code> statement, without using the <code>for</code> statement. This is called <em>unrolling</em> the loop.</p>
  128. <p>A <code>for</code> statement simple replicates the code inside it, but before each iteration, it assigns a new value from the given sequence to the name we chose. For example, here is an unrolled version of the loop above.</p>
  129. </div>
  130. </div>
  131. </div>
  132. </div>
  133. <div class="jb_cell">
  134. <div class="cell border-box-sizing code_cell rendered">
  135. <div class="input">
  136. <div class="inner_cell">
  137. <div class="input_area">
  138. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">animal</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">(</span><span class="s1">&#39;cat&#39;</span><span class="p">,</span> <span class="s1">&#39;dog&#39;</span><span class="p">,</span> <span class="s1">&#39;rabbit&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
  139. <span class="nb">print</span><span class="p">(</span><span class="n">animal</span><span class="p">)</span>
  140. <span class="n">animal</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">(</span><span class="s1">&#39;cat&#39;</span><span class="p">,</span> <span class="s1">&#39;dog&#39;</span><span class="p">,</span> <span class="s1">&#39;rabbit&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
  141. <span class="nb">print</span><span class="p">(</span><span class="n">animal</span><span class="p">)</span>
  142. <span class="n">animal</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">(</span><span class="s1">&#39;cat&#39;</span><span class="p">,</span> <span class="s1">&#39;dog&#39;</span><span class="p">,</span> <span class="s1">&#39;rabbit&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
  143. <span class="nb">print</span><span class="p">(</span><span class="n">animal</span><span class="p">)</span>
  144. </pre></div>
  145. </div>
  146. </div>
  147. </div>
  148. <div class="output_wrapper">
  149. <div class="output">
  150. <div class="jb_output_wrapper }}">
  151. <div class="output_area">
  152. <div class="output_subarea output_stream output_stdout output_text">
  153. <pre>cat
  154. dog
  155. rabbit
  156. </pre>
  157. </div>
  158. </div>
  159. </div>
  160. </div>
  161. </div>
  162. </div>
  163. </div>
  164. <div class="jb_cell">
  165. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  166. <div class="text_cell_render border-box-sizing rendered_html">
  167. <p>Notice that the name <code>animal</code> is arbitrary, just like any name we assign with <code>=</code>.</p>
  168. <p>Here we use a <code>for</code> statement in a more realistic way: we print the results of betting five times on the die as described earlier. This is called <em>simulating</em> the results of five bets. We use the word <em>simulating</em> to remind ourselves that we are not physically rolling dice and exchanging money but using Python to mimic the process.</p>
  169. <p>To repeat a process <code>n</code> times, it is common to use the sequence <code>np.arange(n)</code> in the <code>for</code> statement. It is also common to use a very short name for each item. In our code we will use the name <code>i</code> to remind ourselves that it refers to an item.</p>
  170. </div>
  171. </div>
  172. </div>
  173. </div>
  174. <div class="jb_cell">
  175. <div class="cell border-box-sizing code_cell rendered">
  176. <div class="input">
  177. <div class="inner_cell">
  178. <div class="input_area">
  179. <div class=" highlight hl-ipython3"><pre><span></span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
  180. <span class="nb">print</span><span class="p">(</span><span class="n">bet_on_one_roll</span><span class="p">())</span>
  181. </pre></div>
  182. </div>
  183. </div>
  184. </div>
  185. <div class="output_wrapper">
  186. <div class="output">
  187. <div class="jb_output_wrapper }}">
  188. <div class="output_area">
  189. <div class="output_subarea output_stream output_stdout output_text">
  190. <pre>1
  191. 1
  192. 0
  193. -1
  194. 1
  195. </pre>
  196. </div>
  197. </div>
  198. </div>
  199. </div>
  200. </div>
  201. </div>
  202. </div>
  203. <div class="jb_cell">
  204. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  205. <div class="text_cell_render border-box-sizing rendered_html">
  206. <p>In this case, we simply perform exactly the same (random) action several times, so the code in the body of our <code>for</code> statement does not actually refer to <code>i</code>.</p>
  207. </div>
  208. </div>
  209. </div>
  210. </div>
  211. <div class="jb_cell">
  212. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  213. <div class="text_cell_render border-box-sizing rendered_html">
  214. <h3 id="Augmenting-Arrays">Augmenting Arrays<a class="anchor-link" href="#Augmenting-Arrays"> </a></h3><p>While the <code>for</code> statement above does simulate the results of five bets, the results are simply printed and are not in a form that we can use for computation. Any array of results would be more useful. Thus a typical use of a <code>for</code> statement is to create an array of results, by augmenting the array each time.</p>
  215. <p>The <code>append</code> method in <code>NumPy</code> helps us do this. The call <code>np.append(array_name, value)</code> evaluates to a new array that is <code>array_name</code> augmented by <code>value</code>. When you use <code>append</code>, keep in mind that all the entries of an array must have the same type.</p>
  216. </div>
  217. </div>
  218. </div>
  219. </div>
  220. <div class="jb_cell">
  221. <div class="cell border-box-sizing code_cell rendered">
  222. <div class="input">
  223. <div class="inner_cell">
  224. <div class="input_area">
  225. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">pets</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">(</span><span class="s1">&#39;Cat&#39;</span><span class="p">,</span> <span class="s1">&#39;Dog&#39;</span><span class="p">)</span>
  226. <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pets</span><span class="p">,</span> <span class="s1">&#39;Another Pet&#39;</span><span class="p">)</span>
  227. </pre></div>
  228. </div>
  229. </div>
  230. </div>
  231. <div class="output_wrapper">
  232. <div class="output">
  233. <div class="jb_output_wrapper }}">
  234. <div class="output_area">
  235. <div class="output_text output_subarea output_execute_result">
  236. <pre>array([&#39;Cat&#39;, &#39;Dog&#39;, &#39;Another Pet&#39;], dtype=&#39;&lt;U11&#39;)</pre>
  237. </div>
  238. </div>
  239. </div>
  240. </div>
  241. </div>
  242. </div>
  243. </div>
  244. <div class="jb_cell">
  245. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  246. <div class="text_cell_render border-box-sizing rendered_html">
  247. <p>This keeps the array <code>pets</code> unchanged:</p>
  248. </div>
  249. </div>
  250. </div>
  251. </div>
  252. <div class="jb_cell">
  253. <div class="cell border-box-sizing code_cell rendered">
  254. <div class="input">
  255. <div class="inner_cell">
  256. <div class="input_area">
  257. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">pets</span>
  258. </pre></div>
  259. </div>
  260. </div>
  261. </div>
  262. <div class="output_wrapper">
  263. <div class="output">
  264. <div class="jb_output_wrapper }}">
  265. <div class="output_area">
  266. <div class="output_text output_subarea output_execute_result">
  267. <pre>array([&#39;Cat&#39;, &#39;Dog&#39;], dtype=&#39;&lt;U3&#39;)</pre>
  268. </div>
  269. </div>
  270. </div>
  271. </div>
  272. </div>
  273. </div>
  274. </div>
  275. <div class="jb_cell">
  276. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  277. <div class="text_cell_render border-box-sizing rendered_html">
  278. <p>But often while using <code>for</code> loops it will be convenient to mutate an array – that is, change it – when augmenting it. This is done by assigning the augmented array to the same name as the original.</p>
  279. </div>
  280. </div>
  281. </div>
  282. </div>
  283. <div class="jb_cell">
  284. <div class="cell border-box-sizing code_cell rendered">
  285. <div class="input">
  286. <div class="inner_cell">
  287. <div class="input_area">
  288. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">pets</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pets</span><span class="p">,</span> <span class="s1">&#39;Another Pet&#39;</span><span class="p">)</span>
  289. <span class="n">pets</span>
  290. </pre></div>
  291. </div>
  292. </div>
  293. </div>
  294. <div class="output_wrapper">
  295. <div class="output">
  296. <div class="jb_output_wrapper }}">
  297. <div class="output_area">
  298. <div class="output_text output_subarea output_execute_result">
  299. <pre>array([&#39;Cat&#39;, &#39;Dog&#39;, &#39;Another Pet&#39;], dtype=&#39;&lt;U11&#39;)</pre>
  300. </div>
  301. </div>
  302. </div>
  303. </div>
  304. </div>
  305. </div>
  306. </div>
  307. <div class="jb_cell">
  308. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  309. <div class="text_cell_render border-box-sizing rendered_html">
  310. <h3 id="Example:-Betting-on-5-Rolls">Example: Betting on 5 Rolls<a class="anchor-link" href="#Example:-Betting-on-5-Rolls"> </a></h3><p>We can now simulate five bets on the die and collect the results in an array that we will call the <em>collection array</em>. We will start out by creating an empty array for this, and then append the outcome of each bet. Notice that the body of the <code>for</code> loop contains two statements. Both statements are executed for each item in the given sequence.</p>
  311. </div>
  312. </div>
  313. </div>
  314. </div>
  315. <div class="jb_cell">
  316. <div class="cell border-box-sizing code_cell rendered">
  317. <div class="input">
  318. <div class="inner_cell">
  319. <div class="input_area">
  320. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">outcomes</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">()</span>
  321. <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
  322. <span class="n">outcome_of_bet</span> <span class="o">=</span> <span class="n">bet_on_one_roll</span><span class="p">()</span>
  323. <span class="n">outcomes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">outcomes</span><span class="p">,</span> <span class="n">outcome_of_bet</span><span class="p">)</span>
  324. <span class="n">outcomes</span>
  325. </pre></div>
  326. </div>
  327. </div>
  328. </div>
  329. <div class="output_wrapper">
  330. <div class="output">
  331. <div class="jb_output_wrapper }}">
  332. <div class="output_area">
  333. <div class="output_text output_subarea output_execute_result">
  334. <pre>array([-1., 0., 0., 1., 0.])</pre>
  335. </div>
  336. </div>
  337. </div>
  338. </div>
  339. </div>
  340. </div>
  341. </div>
  342. <div class="jb_cell">
  343. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  344. <div class="text_cell_render border-box-sizing rendered_html">
  345. <p>Let us rewrite the cell with the <code>for</code> statement unrolled:</p>
  346. </div>
  347. </div>
  348. </div>
  349. </div>
  350. <div class="jb_cell">
  351. <div class="cell border-box-sizing code_cell rendered">
  352. <div class="input">
  353. <div class="inner_cell">
  354. <div class="input_area">
  355. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">outcomes</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">()</span>
  356. <span class="n">i</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
  357. <span class="n">outcome_of_bet</span> <span class="o">=</span> <span class="n">bet_on_one_roll</span><span class="p">()</span>
  358. <span class="n">outcomes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">outcomes</span><span class="p">,</span> <span class="n">outcome_of_bet</span><span class="p">)</span>
  359. <span class="n">i</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
  360. <span class="n">outcome_of_bet</span> <span class="o">=</span> <span class="n">bet_on_one_roll</span><span class="p">()</span>
  361. <span class="n">outcomes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">outcomes</span><span class="p">,</span> <span class="n">outcome_of_bet</span><span class="p">)</span>
  362. <span class="n">i</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
  363. <span class="n">outcome_of_bet</span> <span class="o">=</span> <span class="n">bet_on_one_roll</span><span class="p">()</span>
  364. <span class="n">outcomes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">outcomes</span><span class="p">,</span> <span class="n">outcome_of_bet</span><span class="p">)</span>
  365. <span class="n">i</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
  366. <span class="n">outcome_of_bet</span> <span class="o">=</span> <span class="n">bet_on_one_roll</span><span class="p">()</span>
  367. <span class="n">outcomes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">outcomes</span><span class="p">,</span> <span class="n">outcome_of_bet</span><span class="p">)</span>
  368. <span class="n">i</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
  369. <span class="n">outcome_of_bet</span> <span class="o">=</span> <span class="n">bet_on_one_roll</span><span class="p">()</span>
  370. <span class="n">outcomes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">outcomes</span><span class="p">,</span> <span class="n">outcome_of_bet</span><span class="p">)</span>
  371. <span class="n">outcomes</span>
  372. </pre></div>
  373. </div>
  374. </div>
  375. </div>
  376. <div class="output_wrapper">
  377. <div class="output">
  378. <div class="jb_output_wrapper }}">
  379. <div class="output_area">
  380. <div class="output_text output_subarea output_execute_result">
  381. <pre>array([ 0., -1., 0., 1., -1.])</pre>
  382. </div>
  383. </div>
  384. </div>
  385. </div>
  386. </div>
  387. </div>
  388. </div>
  389. <div class="jb_cell">
  390. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  391. <div class="text_cell_render border-box-sizing rendered_html">
  392. <p>The contents of the array are likely to be different from the array that we got by running the previous cell, but that is because of randomness in rolling the die. The process for creating the array is exactly the same.</p>
  393. <p>By capturing the results in an array we have given ourselves the ability to use array methods to do computations. For example, we can use <code>np.count_nonzero</code> to count the number of times money changed hands.</p>
  394. </div>
  395. </div>
  396. </div>
  397. </div>
  398. <div class="jb_cell">
  399. <div class="cell border-box-sizing code_cell rendered">
  400. <div class="input">
  401. <div class="inner_cell">
  402. <div class="input_area">
  403. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">outcomes</span><span class="p">)</span>
  404. </pre></div>
  405. </div>
  406. </div>
  407. </div>
  408. <div class="output_wrapper">
  409. <div class="output">
  410. <div class="jb_output_wrapper }}">
  411. <div class="output_area">
  412. <div class="output_text output_subarea output_execute_result">
  413. <pre>3</pre>
  414. </div>
  415. </div>
  416. </div>
  417. </div>
  418. </div>
  419. </div>
  420. </div>
  421. <div class="jb_cell">
  422. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  423. <div class="text_cell_render border-box-sizing rendered_html">
  424. <h3 id="Example:-Betting-on-300-Rolls">Example: Betting on 300 Rolls<a class="anchor-link" href="#Example:-Betting-on-300-Rolls"> </a></h3><p>Iteration is a powerful technique. For example, we can see the variation in the results of 300 bets by running exactly the same code for 300 bets instead of five.</p>
  425. </div>
  426. </div>
  427. </div>
  428. </div>
  429. <div class="jb_cell">
  430. <div class="cell border-box-sizing code_cell rendered">
  431. <div class="input">
  432. <div class="inner_cell">
  433. <div class="input_area">
  434. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">outcomes</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">()</span>
  435. <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">300</span><span class="p">):</span>
  436. <span class="n">outcome_of_bet</span> <span class="o">=</span> <span class="n">bet_on_one_roll</span><span class="p">()</span>
  437. <span class="n">outcomes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">outcomes</span><span class="p">,</span> <span class="n">outcome_of_bet</span><span class="p">)</span>
  438. </pre></div>
  439. </div>
  440. </div>
  441. </div>
  442. </div>
  443. </div>
  444. <div class="jb_cell">
  445. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  446. <div class="text_cell_render border-box-sizing rendered_html">
  447. <p>The array <code>outcomes</code> contains the results of all 300 bets.</p>
  448. </div>
  449. </div>
  450. </div>
  451. </div>
  452. <div class="jb_cell">
  453. <div class="cell border-box-sizing code_cell rendered">
  454. <div class="input">
  455. <div class="inner_cell">
  456. <div class="input_area">
  457. <div class=" highlight hl-ipython3"><pre><span></span><span class="nb">len</span><span class="p">(</span><span class="n">outcomes</span><span class="p">)</span>
  458. </pre></div>
  459. </div>
  460. </div>
  461. </div>
  462. <div class="output_wrapper">
  463. <div class="output">
  464. <div class="jb_output_wrapper }}">
  465. <div class="output_area">
  466. <div class="output_text output_subarea output_execute_result">
  467. <pre>300</pre>
  468. </div>
  469. </div>
  470. </div>
  471. </div>
  472. </div>
  473. </div>
  474. </div>
  475. <div class="jb_cell">
  476. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  477. <div class="text_cell_render border-box-sizing rendered_html">
  478. <p>To see how often the three different possible results appeared, we can use the array <code>outcomes</code> and <code>Table</code> methods.</p>
  479. </div>
  480. </div>
  481. </div>
  482. </div>
  483. <div class="jb_cell">
  484. <div class="cell border-box-sizing code_cell rendered">
  485. <div class="input">
  486. <div class="inner_cell">
  487. <div class="input_area">
  488. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">outcome_table</span> <span class="o">=</span> <span class="n">Table</span><span class="p">()</span><span class="o">.</span><span class="n">with_column</span><span class="p">(</span><span class="s1">&#39;Outcome&#39;</span><span class="p">,</span> <span class="n">outcomes</span><span class="p">)</span>
  489. <span class="n">outcome_table</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">&#39;Outcome&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">barh</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
  490. </pre></div>
  491. </div>
  492. </div>
  493. </div>
  494. <div class="output_wrapper">
  495. <div class="output">
  496. <div class="jb_output_wrapper }}">
  497. <div class="output_area">
  498. <div class="output_png output_subarea ">
  499. <img src="../../../images/chapters/09/2/Iteration_29_0.png"
  500. >
  501. </div>
  502. </div>
  503. </div>
  504. </div>
  505. </div>
  506. </div>
  507. </div>
  508. <div class="jb_cell">
  509. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  510. <div class="text_cell_render border-box-sizing rendered_html">
  511. <p>Not surprisingly, each of the three outcomes -1, 0, and 1 appeared about about 100 of the 300 times, give or take. We will examine the "give or take" amounts more closely in later chapters.</p>
  512. </div>
  513. </div>
  514. </div>
  515. </div>