vectorized implementation of list sliding in numpy… here is a solution to the problem.
vectorized implementation of list sliding in numpy
From the given numpy array [1,2,3,4] and window wz=2 (two elements before each element and two elements after each element) I have to get the pair (central el, el from window). Pairs with non-existent elements can be skipped or replaced with zeros. So in this example I have to get this :
[[1., 0.]
[2., 1.]
[3., 2.]
[4., 3.]
[1., 2.]
[2., 3.]
[3., 4.]
[4., 0.]
[1., 0.]
[2., 0.]
[3., 1.]
[4., 2.]
[1., 3.]
[2., 4.]
[3., 0.]
[4., 0.]]
My implementation is extremely inefficient and looks like:
x = np.array([1,2,3,4])
l = x.shape[0]
for i in range(1, m):
init = np.empty((x.shape[0]*2,2))
init[:,0] = np.append(x, x)
init[:l,1] = np.pad(x, (i,0), mode='constant')[:l]
init[-l:,1] = np.pad(x, (0,i), mode='constant')[-l:]
corpus.extend(init)
Can someone provide a more effective solution?
On another simple test data and variant I implemented, I got:
285 µs ± 19.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
379 µs ± 7.68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Solution
This is a Numpythonic method:
In [23]: a = np.array([1,2,3,4])
In [24]: arr = np.hstack((a-1, a+1, a - 2, a+ 2))
In [25]: mask = ~np.in1d(arr, a)
In [26]: arr[mask] = 0
In [27]: np.column_stack((np.tile(a, 4), arr))
Out[27]:
array([ [1, 0],
[2, 1],
[3, 2],
[4, 3],
[1, 2],
[2, 3],
[3, 4],
[4, 0],
[1, 0],
[2, 0],
[3, 1],
[4, 2],
[1, 3],
[2, 4],
[3, 0],
[4, 0]])