title: Replace looping-over-axes with broadcasting
body: <p>Say I have:</p>
  
  <pre><code>a = np.array([[2, 4],
                [6, 8]])    
  b = np.array([[1, 3],
                [1, 5]])
  </code></pre>
  
  <p>I want to get to:</p>
  
  <pre><code>c = np.array([[20,32],
                [28, 44]])
  </code></pre>
  
  <p>where <code>c</code> is the result of multiplying each column of <code>a</code> by <code>b</code>, then summing that result along the first axis.</p>
  
  <p>I.e.:</p>
  
  <pre><code>print(np.sum(a[:, 0] * b, axis=1))
  [20 32]
  
  print(np.sum(a[:, 1] * b, axis=1))
  [28 44]
  </code></pre>
  
  <p>Can I do through broadcasting rather than:</p>
  
  <ul>
  <li>using <code>np.apply_along_axis</code> or</li>
  <li>looping through each column?</li>
  </ul>