np.lib.stride_tricks.as_strided 详解

这个模块是 numpy 里面的一个高效分块操作。

numpy.lib.stride_tricks.as_strided(x, shape=None, strides=None, subok=False, writeable=True)

例如如果我们把矩阵 A:
A = [ 1 2 5 6 3 4 7 8 9 10 13 14 11 12 15 16 ] A = \left[ \begin{matrix} 1 & 2 & 5 & 6 \\ 3 & 4 & 7 & 8 \\ 9 & 10 & 13 & 14 \\ 11 & 12 & 15 & 16 \end{matrix} \right] A=13911241012571315681416
分成 矩阵B:
B = [ [ 1 2 3 4 ] [ 5 6 7 8 ] [ 9 10 11 12 ] [ 13 14 15 16 ] ] B = \left[ \begin{matrix} \left[ \begin{matrix} 1 & 2 \\ 3 & 4 \end{matrix} \right] \left[ \begin{matrix} 5 & 6 \\ 7 & 8 \end{matrix} \right]\\ \left[ \begin{matrix} 9 & 10 \\ 11 & 12 \end{matrix} \right] \left[ \begin{matrix} 13 & 14 \\ 15 & 16 \end{matrix} \right] \end{matrix} \right] B=[1324][5768][9111012][13151416]
B 由 2 * 2 个 2* 2 的矩阵构成,所以B 的形状是 (2, 2, 2,2),所以第一个参数shape应该为 (2, 2, 2, 2)。
这里按步长为2 进行分块 (水平垂直每个点各距离2个点的距离)

而strides 表示整个内部 22 的矩阵在外部 22 的矩阵中的移动步长和内部 2*2 的矩阵内部的需要移动的步长。
详细点说就是:
例如从1—>9 需要移动 外部矩阵的width * stride 的步数,也就是需要移动 4 * 2 = 8 步数,所以第一个值为8.
表示需要从1 —> 2 —> 3 —> 4 —> 5 —> 6 —> 7 —> 8 —> 9需要经过8个步长。
同理从第一个内部矩阵移动到第二个内部矩阵表示从1 —> 5, 需要 stride = 2 步。所以第二个值为2,至此外部的移动完毕。
同理,内部的移动从第一个行第一个点到第二行的第一个点也就是1 —> 3 (这里的3 不代表最后一行,而是表示下一行,只是这里是2 *2 所以第二行也是最后一行) 需要 外部 width = 4 步,也就是1 —> 2 —> 3 —> 4 —> 5,所以第三个值为4.
同理从第一列到第二列1 —> 2 需要1 步,所以第四个值为1.
至此得 strides = (8, 2, 4, 1).
剩下的参数可以参考package说明。

你可能感兴趣的:(Pytorch)