Numpy Vectorization of sliding-window operation
<p>I have the following numpy arrays:</p>

<pre><code>arr_1 = [[1,2],[3,4],[5,6]]   # 3 X 2 
arr_2 = [[0.5,0.6],[0.7,0.8],[0.9,1.0],[1.1,1.2],[1.3,1.4]]  # 5 X 2
</code></pre>

<p><code>arr_1</code> is clearly a <code>3 X 2</code> array, whereas <code>arr_2</code> is a <code>5 X 2</code> array. </p>

<p>Now without looping, I want to element-wise multiply arr_1 and arr_2 so that I apply a sliding window technique (window size 3) to arr_2.</p>

<pre><code>Example:

Multiplication 1:  np.multiply(arr_1,arr_2[:3,:])

Multiplication 2: np.multiply(arr_1,arr_2[1:4,:])

Multiplication 3: np.multiply(arr_1,arr_2[2:5,:])
</code></pre>

<p>I want to do this in some sort of a matrix multiplication form to make it faster than my current solution which is of the form:</p>

<pre><code>for i in (2):
   np.multiply(arr_1,arr_2[i:i+3,:])  
</code></pre>

<p>So if the number of rows in arr_2 are large (of the order of tens of thousands), this solution doesn't really scale very well.</p>

<p>Any help would be much appreciated.</p>

<p>This is a nice case to test the speed of <code>as_strided</code> and Divakar's broadcasting.</p>

<pre><code>In [281]: %%timeit 
     ...: out=np.empty((L,W,arr1.shape[1]))
     ...: for i in range(L):
     ...:    out[i]=np.multiply(arr1,arr2[i:i+W,:])
     ...: 
10 loops, best of 3: 48.9 ms per loop
In [282]: %%timeit
     ...: idx=np.arange(L)[:,None]+np.arange(W)
     ...: out=arr1*arr2[idx]
     ...: 
100 loops, best of 3: 2.18 ms per loop
In [283]: %%timeit
     ...: arr3=as_strided(arr2, shape=(L,W,2), strides=(16,16,8))
     ...: out=arr1*arr3
     ...: 
1000 loops, best of 3: 805 Âµs per loop
</code></pre>

<p><a href="http://stackoverflow.com/questions/39024320/create-numpy-array-without-enumerating-array">Create Numpy array without enumerating array</a>  for more of a comparison of these methods.</p>

python arrays numpy matrix-multiplication sliding-window