这个模块是 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说明。