title: numpy/scipy, loop over subarrays
body: <p>Lately I've been doing a lot of processing on 8x8 blocks of image-data.
  Standard approach has been to use nested for-loops to extract the blocks, e.g.</p>
  
  <pre><code>for y in xrange(0,height,8):
      for x in xrange(0,width,8):
          d = image_data[y:y+8,x:x+8]
          # further processing on the 8x8-block
  </code></pre>
  
  <p>I can't help to wonder if there is a way to vectorize this operation or another approach using numpy/scipy that I can use instead? An iterator of some kind?</p>
  
  <p>A MWE<sup>1</sup>:</p>
  
  <pre><code>#!/usr/bin/env python
  
  import sys
  import numpy as np
  from scipy.fftpack import dct, idct
  import scipy.misc
  import matplotlib.pyplot as plt
  
  def dctdemo(coeffs=1):
      unzig = np.array([
           0,  1,  8, 16,  9,  2,  3, 10,
          17, 24, 32, 25, 18, 11,  4, 5,
          12, 19, 26, 33, 40, 48, 41, 34,
          27, 20, 13,  6,  7, 14, 21, 28,
          35, 42, 49, 56, 57, 50, 43, 36,
          29, 22, 15, 23, 30, 37, 44, 51,
          58, 59, 52, 45, 38, 31, 39, 46,
          53, 60, 61, 54, 47, 55, 62, 63])
  
      lena = scipy.misc.lena()
      width, height = lena.shape
  
      # reconstructed
      rec = np.zeros(lena.shape, dtype=np.int64)
  
      # Can this part be vectorized?
      for y in xrange(0,height,8):
          for x in xrange(0,width,8):
              d = lena[y:y+8,x:x+8].astype(np.float)
              D = dct(dct(d.T, norm='ortho').T, norm='ortho').reshape(64)
              Q = np.zeros(64, dtype=np.float)
              Q[unzig[:coeffs]] = D[unzig[:coeffs]]
              Q = Q.reshape([8,8])
              q = np.round(idct(idct(Q.T, norm='ortho').T, norm='ortho'))
              rec[y:y+8,x:x+8] = q.astype(np.int64)
  
      plt.imshow(rec, cmap='gray')
      plt.show()
  
  if __name__ == '__main__':
      try:
          c = int(sys.argv[1])
      except ValueError:
          sys.exit()
      else:
          if 1 &lt;= int(sys.argv[1]) &lt;= 64:
              dctdemo(int(sys.argv[1]))
  </code></pre>
  
  <hr>
  
  <p><strong>Footnotes:</strong></p>
  
  <ol>
  <li>Actual application: <a href="https://github.com/figgis/dctdemo" rel="nofollow">https://github.com/figgis/dctdemo</a></li>
  </ol>