import numpy as np
n=4
m=5
a = np.arange(1,n*m+1).reshape(n,m)
print(a)
# [[ 1 2 3 4 5]
# [ 6 7 8 9 10]
# [11 12 13 14 15]
# [16 17 18 19 20]]
sz = a.itemsize
h,w = a.shape
bh,bw = 2,2
shape = (h/bh, w/bw, bh, bw)
print(shape)
# (2, 2, 2, 2)
strides = sz*np.array([w*bh,bw,w,1])
print(strides)
# [40 8 20 4]
blocks=np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
print(blocks)
# [[[[ 1 2]
# [ 6 7]]
# [[ 3 4]
# [ 8 9]]]
# [[[11 12]
# [16 17]]
# [[13 14]
# [18 19]]]]
Начиная с 1
в a
(т. Е. blocks[0,0,0,0]
), чтобы добраться до 2
(т. Е. blocks[0,0,0,1]
), остается один пункт. Поскольку (на моей машине) a.itemsize
составляет 4 байта, шаг равен 1 * 4 = 4. Это дает нам последнее значение в strides = (10,2,5,1)*a.itemsize = (40,8,20,4)
.
Начиная с 1
снова, чтобы добраться до 6
(т. Е. blocks[0,0,1,0]
), на расстоянии 5 (т. Е. w
) предметов, так что шаг 5 * 4 = 20. Это объясняет значение от второго до последнего в strides
.
Начиная с 1
еще раз, чтобы добраться до 3
(т. Е. blocks[0,1,0,0]
), на расстоянии 2 (т. Е. bw
) пунктов, поэтому шаг равен 2 * 4 = 8. Это объясняет второе значение в strides
.
Наконец, начиная с 1
, чтобы добраться до 11
(т. Е. blocks[1,0,0,0]
), нужно 10 (т. Е. w*bh
) предметов, поэтому шаг составляет 10 * 4 = 40. Итак, strides = (40,8,20,4)
.