受矩阵解决方案的滚行启发,以下是基于
np.lib.stride_tricks.as_strided-
from skimage.util.shape import view_as_windows as viewWdef strided_indexing_roll(a, r): # Concatenate with sliced to cover all rolls p = np.full((a.shape[0],a.shape[1]-1),np.nan) a_ext = np.concatenate((p,a,p),axis=1) # Get sliding windows; use advanced-indexing to select appropriate ones n = a.shape[1] return viewW(a_ext,(1,n))[np.arange(len(r)), -r + (n-1),0]
样品运行-
In [76]: aOut[76]: array([[4, 0, 0], [1, 2, 3], [0, 0, 5]])In [77]: rOut[77]: array([ 2, 0, -1])In [78]: strided_indexing_roll(a, r)Out[78]: array([[nan, nan, 4.], [ 1., 2., 3.], [ 0., 5., nan]])



