Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p><strong>EDIT</strong>: ah crap, my answer is just writing <code>im[i-d:i+d+1, j-d:j+d+1].flatten()</code> but written in a incomprehensible way :)</p> <hr> <p>The good old sliding window trick may help here:</p> <pre><code>import numpy as np from numpy.lib.stride_tricks import as_strided def sliding_window(arr, window_size): """ Construct a sliding window view of the array""" arr = np.asarray(arr) window_size = int(window_size) if arr.ndim != 2: raise ValueError("need 2-D input") if not (window_size &gt; 0): raise ValueError("need a positive window size") shape = (arr.shape[0] - window_size + 1, arr.shape[1] - window_size + 1, window_size, window_size) if shape[0] &lt;= 0: shape = (1, shape[1], arr.shape[0], shape[3]) if shape[1] &lt;= 0: shape = (shape[0], 1, shape[2], arr.shape[1]) strides = (arr.shape[1]*arr.itemsize, arr.itemsize, arr.shape[1]*arr.itemsize, arr.itemsize) return as_strided(arr, shape=shape, strides=strides) def cell_neighbors(arr, i, j, d): """Return d-th neighbors of cell (i, j)""" w = sliding_window(arr, 2*d+1) ix = np.clip(i - d, 0, w.shape[0]-1) jx = np.clip(j - d, 0, w.shape[1]-1) i0 = max(0, i - d - ix) j0 = max(0, j - d - jx) i1 = w.shape[2] - max(0, d - i + ix) j1 = w.shape[3] - max(0, d - j + jx) return w[ix, jx][i0:i1,j0:j1].ravel() x = np.arange(8*8).reshape(8, 8) print x for d in [1, 2]: for p in [(0,0), (0,1), (6,6), (8,8)]: print "-- d=%d, %r" % (d, p) print cell_neighbors(x, p[0], p[1], d=d) </code></pre> <p>Didn't do any timings here, but it's possible this version has reasonable performance.</p> <p>For more info, search the net with phrases "rolling window numpy" or "sliding window numpy".</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload