title: Getting the maximum in each rolling window of a 2D numpy array
body: <p>I have a 2D numpy array and I want to get the maximum value contained in each 2d rolling window that starts from left to right, top to bottom, rolling one row or column each time. The most naive method would be iterating through all rolling windows and get the maximum of all values enclosed in this rolling window. I wrote down this method below:</p>
  
  <pre><code>import numpy as np
  shape=(1050,300)
  window_size=(120,60)
  a = np.arange(shape[1]*shape[0]).reshape(shape[1],shape[0])
  max_Map=np.full((shape[1]-window_size[1]+1,shape[0]-window_size[0]+1),0,dtype='uint32')
  
  for i in range(shape[1]-window_size[1]+1):
      for j in range(shape[0]-window_size[0]+1):
          window_max=np.max(a[i:i+window_size[1],j:j+window_size[0]])
          max_Map[i][j]=window_max
  </code></pre>
  
  <p>But this is terribly inefficient, as there are only 2 rows(or 2 column) changed between each sliding but my code doesn't take into account any correlations between 2 consecutive rolling windows. An improvement I could think of is for each sliding window(assuming rolling horizontally) I will calculate the maximum of the left most column and the maximum of the remaining columns and take the max of the 2 values as the current window maximum. And for the next rolling window the maximum will be max of the newly added column and the previous remaining columns...But I still don't think this is optimized...</p>
  
  <p>I will really appreciate it if someone can point me to the right direction,I feel like this should be a well studied problem but I couldn't find solutions anywhere...
  Thanks in advance!</p>