More_on_Arrays.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. ---
  2. redirect_from:
  3. - "/chapters/05/3/more-on-arrays"
  4. interact_link: content/chapters/05/3/More_on_Arrays.ipynb
  5. kernel_name: python3
  6. has_widgets: false
  7. title: |-
  8. More on Arrays
  9. prev_page:
  10. url: /chapters/05/2/Ranges.html
  11. title: |-
  12. Ranges
  13. next_page:
  14. url: /chapters/06/Tables.html
  15. title: |-
  16. Tables
  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. <h1 id="More-on-Arrays">More on Arrays<a class="anchor-link" href="#More-on-Arrays"> </a></h1><p>It's often necessary to compute something that involves data from more than one array. If two arrays are of the same size, Python makes it easy to do calculations involving both arrays.</p>
  27. <p>For our first example, we return once more to the temperature data. This time, we create arrays of average daily <a href="http://berkeleyearth.lbl.gov/auto/Regional/TMAX/Text/global-land-TMAX-Trend.txt">high</a> and <a href="http://berkeleyearth.lbl.gov/auto/Regional/TMIN/Text/global-land-TMIN-Trend.txt">low</a> temperatures for the decades surrounding 1850, 1900, 1950, and 2000.</p>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. <div class="jb_cell">
  33. <div class="cell border-box-sizing code_cell rendered">
  34. <div class="input">
  35. <div class="inner_cell">
  36. <div class="input_area">
  37. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">baseline_high</span> <span class="o">=</span> <span class="mf">14.48</span>
  38. <span class="n">highs</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">(</span><span class="n">baseline_high</span> <span class="o">-</span> <span class="mf">0.880</span><span class="p">,</span>
  39. <span class="n">baseline_high</span> <span class="o">-</span> <span class="mf">0.093</span><span class="p">,</span>
  40. <span class="n">baseline_high</span> <span class="o">+</span> <span class="mf">0.105</span><span class="p">,</span>
  41. <span class="n">baseline_high</span> <span class="o">+</span> <span class="mf">0.684</span><span class="p">)</span>
  42. <span class="n">highs</span>
  43. </pre></div>
  44. </div>
  45. </div>
  46. </div>
  47. <div class="output_wrapper">
  48. <div class="output">
  49. <div class="jb_output_wrapper }}">
  50. <div class="output_area">
  51. <div class="output_text output_subarea output_execute_result">
  52. <pre>array([ 13.6 , 14.387, 14.585, 15.164])</pre>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. <div class="jb_cell">
  61. <div class="cell border-box-sizing code_cell rendered">
  62. <div class="input">
  63. <div class="inner_cell">
  64. <div class="input_area">
  65. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">baseline_low</span> <span class="o">=</span> <span class="mf">3.00</span>
  66. <span class="n">lows</span> <span class="o">=</span> <span class="n">make_array</span><span class="p">(</span><span class="n">baseline_low</span> <span class="o">-</span> <span class="mf">0.872</span><span class="p">,</span> <span class="n">baseline_low</span> <span class="o">-</span> <span class="mf">0.629</span><span class="p">,</span>
  67. <span class="n">baseline_low</span> <span class="o">-</span> <span class="mf">0.126</span><span class="p">,</span> <span class="n">baseline_low</span> <span class="o">+</span> <span class="mf">0.728</span><span class="p">)</span>
  68. <span class="n">lows</span>
  69. </pre></div>
  70. </div>
  71. </div>
  72. </div>
  73. <div class="output_wrapper">
  74. <div class="output">
  75. <div class="jb_output_wrapper }}">
  76. <div class="output_area">
  77. <div class="output_text output_subarea output_execute_result">
  78. <pre>array([ 2.128, 2.371, 2.874, 3.728])</pre>
  79. </div>
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. <div class="jb_cell">
  87. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  88. <div class="text_cell_render border-box-sizing rendered_html">
  89. <p>Suppose we'd like to compute the average daily <em>range</em> of temperatures for each decade. That is, we want to subtract the average daily high in the 1850s from the average daily low in the 1850s, and the same for each other decade.</p>
  90. <p>We could write this laboriously using <code>.item</code>:</p>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. <div class="jb_cell">
  96. <div class="cell border-box-sizing code_cell rendered">
  97. <div class="input">
  98. <div class="inner_cell">
  99. <div class="input_area">
  100. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">make_array</span><span class="p">(</span>
  101. <span class="n">highs</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">-</span> <span class="n">lows</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
  102. <span class="n">highs</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="n">lows</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span>
  103. <span class="n">highs</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="n">lows</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span>
  104. <span class="n">highs</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">-</span> <span class="n">lows</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
  105. <span class="p">)</span>
  106. </pre></div>
  107. </div>
  108. </div>
  109. </div>
  110. <div class="output_wrapper">
  111. <div class="output">
  112. <div class="jb_output_wrapper }}">
  113. <div class="output_area">
  114. <div class="output_text output_subarea output_execute_result">
  115. <pre>array([ 11.472, 12.016, 11.711, 11.436])</pre>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. <div class="jb_cell">
  124. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  125. <div class="text_cell_render border-box-sizing rendered_html">
  126. <p>As when we converted an array of temperatures from Celsius to Fahrenheit, Python provides a much cleaner way to write this:</p>
  127. </div>
  128. </div>
  129. </div>
  130. </div>
  131. <div class="jb_cell">
  132. <div class="cell border-box-sizing code_cell rendered">
  133. <div class="input">
  134. <div class="inner_cell">
  135. <div class="input_area">
  136. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">highs</span> <span class="o">-</span> <span class="n">lows</span>
  137. </pre></div>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="output_wrapper">
  142. <div class="output">
  143. <div class="jb_output_wrapper }}">
  144. <div class="output_area">
  145. <div class="output_text output_subarea output_execute_result">
  146. <pre>array([ 11.472, 12.016, 11.711, 11.436])</pre>
  147. </div>
  148. </div>
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. </div>
  154. <div class="jb_cell">
  155. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  156. <div class="text_cell_render border-box-sizing rendered_html">
  157. <p><img src="../../../images/array_subtraction.png" /></p>
  158. </div>
  159. </div>
  160. </div>
  161. </div>
  162. <div class="jb_cell">
  163. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  164. <div class="text_cell_render border-box-sizing rendered_html">
  165. <p>What we've seen in these examples are special cases of a general feature of arrays.</p>
  166. </div>
  167. </div>
  168. </div>
  169. </div>
  170. <div class="jb_cell">
  171. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  172. <div class="text_cell_render border-box-sizing rendered_html">
  173. <h3 id="Elementwise-arithmetic-on-pairs-of-numerical-arrays">Elementwise arithmetic on pairs of numerical arrays<a class="anchor-link" href="#Elementwise-arithmetic-on-pairs-of-numerical-arrays"> </a></h3><p>If an arithmetic operator acts on two arrays of the same size, then the operation is performed on each corresponding pair of elements in the two arrays. The final result is an array.</p>
  174. <p>For example, if <code>array1</code> and <code>array2</code> have the same number of elements, then the value of <code>array1 * array2</code> is an array. Its first element is the first element of <code>array1</code> times the first element of <code>array2</code>, its second element is the second element of <code>array1</code> times the second element of <code>array2</code>, and so on.</p>
  175. </div>
  176. </div>
  177. </div>
  178. </div>
  179. <div class="jb_cell">
  180. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  181. <div class="text_cell_render border-box-sizing rendered_html">
  182. <h3 id="Example:-Wallis'-Formula-for-$\pi$">Example: Wallis' Formula for $\pi$<a class="anchor-link" href="#Example:-Wallis'-Formula-for-$\pi$"> </a></h3><p>The number $\pi$ is important in many different areas of math. Centuries before computers were invented, mathematicians worked on finding simple ways to approximate the numerical value of $\pi$. We have already seen Leibniz's formula for $\pi$. About half a century before Leibniz, the English mathematician <a href="https://en.wikipedia.org/wiki/John_Wallis">John Wallis</a> (1616-1703) also expressed $\pi$ in terms of simple fractions, as an infinite product.</p>
  183. $$
  184. \pi = 2 \cdot \left( \frac{2}{1}\cdot\frac{2}{3}\cdot\frac{4}{3}\cdot\frac{4}{5}\cdot\frac{6}{5}\cdot\frac{6}{7}\dots \right)
  185. $$
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. <div class="jb_cell">
  191. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  192. <div class="text_cell_render border-box-sizing rendered_html">
  193. <p>This is a product of "even/odd" fractions. Let's use arrays to multiply a million of them, and see if the product is close to $\pi$.</p>
  194. </div>
  195. </div>
  196. </div>
  197. </div>
  198. <div class="jb_cell">
  199. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  200. <div class="text_cell_render border-box-sizing rendered_html">
  201. <p>Remember that multiplication can done in any order <a href="#footnotes">[1]</a>, so we can readjust our calculation to:</p>
  202. $$\pi \approx 2 \cdot \left( \frac{2}{1} \cdot \frac{4}{3} \cdot \frac{6}{5} \cdots \frac{1,000,000}{999999} \right) \cdot \left( \frac{2}{3} \cdot \frac{4}{5} \cdot \frac{6}{7} \cdots \frac{1,000,000}{1,000,001} \right)$$
  203. </div>
  204. </div>
  205. </div>
  206. </div>
  207. <div class="jb_cell">
  208. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  209. <div class="text_cell_render border-box-sizing rendered_html">
  210. <p>We're now ready to do the calculation. We start by creating an array of even numbers 2, 4, 6, and so on upto 1,000,000. Then we create two lists of odd numbers: 1, 3, 5, 7, ... upto 999,999, and 3, 5, 7, ... upto 1,000,001.</p>
  211. </div>
  212. </div>
  213. </div>
  214. </div>
  215. <div class="jb_cell">
  216. <div class="cell border-box-sizing code_cell rendered">
  217. <div class="input">
  218. <div class="inner_cell">
  219. <div class="input_area">
  220. <div class=" highlight hl-ipython3"><pre><span></span><span class="n">even</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">2</span><span class="p">,</span> <span class="mi">1000001</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
  221. <span class="n">one_below_even</span> <span class="o">=</span> <span class="n">even</span> <span class="o">-</span> <span class="mi">1</span>
  222. <span class="n">one_above_even</span> <span class="o">=</span> <span class="n">even</span> <span class="o">+</span> <span class="mi">1</span>
  223. </pre></div>
  224. </div>
  225. </div>
  226. </div>
  227. </div>
  228. </div>
  229. <div class="jb_cell">
  230. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  231. <div class="text_cell_render border-box-sizing rendered_html">
  232. <p>Remember that <code>np.prod</code> multiplies all the elements of an array together. Now we can calculate Wallis' product, to a good approximation.</p>
  233. </div>
  234. </div>
  235. </div>
  236. </div>
  237. <div class="jb_cell">
  238. <div class="cell border-box-sizing code_cell rendered">
  239. <div class="input">
  240. <div class="inner_cell">
  241. <div class="input_area">
  242. <div class=" highlight hl-ipython3"><pre><span></span><span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">prod</span><span class="p">(</span><span class="n">even</span><span class="o">/</span><span class="n">one_below_even</span><span class="p">)</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">prod</span><span class="p">(</span><span class="n">even</span><span class="o">/</span><span class="n">one_above_even</span><span class="p">)</span>
  243. </pre></div>
  244. </div>
  245. </div>
  246. </div>
  247. <div class="output_wrapper">
  248. <div class="output">
  249. <div class="jb_output_wrapper }}">
  250. <div class="output_area">
  251. <div class="output_text output_subarea output_execute_result">
  252. <pre>3.1415910827951143</pre>
  253. </div>
  254. </div>
  255. </div>
  256. </div>
  257. </div>
  258. </div>
  259. </div>
  260. <div class="jb_cell">
  261. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  262. <div class="text_cell_render border-box-sizing rendered_html">
  263. <p>That's $\pi$ correct to five decimal places. Wallis clearly came up with a great formula.</p>
  264. </div>
  265. </div>
  266. </div>
  267. </div>
  268. <div class="jb_cell">
  269. <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
  270. <div class="text_cell_render border-box-sizing rendered_html">
  271. <p><a id='footnotes'></a></p>
  272. <h5 id="Footnotes">Footnotes<a class="anchor-link" href="#Footnotes"> </a></h5><p>[1] As we saw in the example about Leibniz's formula, when we add <em>infinitely</em> many fractions, the order can matter. The same is true with multiplying fractions, as we are doing here. But our approximation to $\pi$ uses only a large finite number of fractions, so it's okay to multiply the terms in any convenient order.</p>
  273. </div>
  274. </div>
  275. </div>
  276. </div>