In [ ]:
# Here is the notebook where we developed intuition about the problem
# This is, we believe, a good example of visualization driven developement for deep learning

%pylab inline
import numpy as np

In [32]:
def pony(I, r):
    assert len(I.shape) == 3
    assert r>0
    r = int(r)
    O = np.zeros((I.shape[0]*r, I.shape[1]*r, I.shape[2]/(r*2)))
    for x in range(O.shape[0]):
        for y in range(O.shape[1]):
            for c in range(O.shape[2]):
                c += 1
                a = np.floor(x/r).astype("int")
                b = np.floor(y/r).astype("int")
                d = c*r*(y%r) + c*(x%r)
                print a, b, d
                O[x, y, c-1] = I[a, b, d]
    return O

In [33]:
I = np.concatenate([np.ones((8, 8, 1))*0, 20*np.ones((8, 8, 1)), 30*np.ones((8, 8, 1)), 40*np.ones((8, 8, 1))], axis=-1)

In [38]:
imshow(O[:, :, 0], interpolation="none")


Out[38]:
<matplotlib.image.AxesImage at 0x7f9532c97b50>

In [49]:
imshow(I.reshape(16, 16), interpolation="none")


Out[49]:
<matplotlib.image.AxesImage at 0x7f9532bdd850>

In [52]:
A = I.reshape(-1, 2, 2)
A = np.concatenate([i for i in A], axis=0)
print A.shape
imshow(A, interpolation="none")


(128, 2)
Out[52]:
<matplotlib.image.AxesImage at 0x7f953298a650>

In [67]:
B = I.reshape(8, 8, 2, 2)

In [68]:
B = np.concatenate([B[i] for i in range(8)], axis=1)
print B.shape


(8, 16, 2)

In [69]:
B = B.transpose(1, 2, 0)
print B.shape


(16, 2, 8)

In [70]:
B = np.concatenate([B[:, :, i] for i in range(8)], axis=1)
print B.shape


(16, 16)

In [71]:
imshow(B, interpolation="none")


Out[71]:
<matplotlib.image.AxesImage at 0x7f95327eb610>

In [72]:
def pony2(I, r):
    B = I.reshape(8, 8, 2, 2).transpose(0, 1, 3, 2)
    B = np.concatenate([B[i] for i in range(8)], axis=1)
    B = B.transpose(1, 2, 0)
    B = np.concatenate([B[:, :, i] for i in range(8)], axis=1)
    return B

In [73]:
B = pony2(I)
imshow(B, interpolation="none")


Out[73]:
<matplotlib.image.AxesImage at 0x7f953276ee90>

In [75]:
I = np.arange(16*16).reshape(8, 8, 4)
A = pony(I, 2)
B = pony2(I)


0 0 0
0 0 2
0 1 0
0 1 2
0 2 0
0 2 2
0 3 0
0 3 2
0 4 0
0 4 2
0 5 0
0 5 2
0 6 0
0 6 2
0 7 0
0 7 2
0 0 1
0 0 3
0 1 1
0 1 3
0 2 1
0 2 3
0 3 1
0 3 3
0 4 1
0 4 3
0 5 1
0 5 3
0 6 1
0 6 3
0 7 1
0 7 3
1 0 0
1 0 2
1 1 0
1 1 2
1 2 0
1 2 2
1 3 0
1 3 2
1 4 0
1 4 2
1 5 0
1 5 2
1 6 0
1 6 2
1 7 0
1 7 2
1 0 1
1 0 3
1 1 1
1 1 3
1 2 1
1 2 3
1 3 1
1 3 3
1 4 1
1 4 3
1 5 1
1 5 3
1 6 1
1 6 3
1 7 1
1 7 3
2 0 0
2 0 2
2 1 0
2 1 2
2 2 0
2 2 2
2 3 0
2 3 2
2 4 0
2 4 2
2 5 0
2 5 2
2 6 0
2 6 2
2 7 0
2 7 2
2 0 1
2 0 3
2 1 1
2 1 3
2 2 1
2 2 3
2 3 1
2 3 3
2 4 1
2 4 3
2 5 1
2 5 3
2 6 1
2 6 3
2 7 1
2 7 3
3 0 0
3 0 2
3 1 0
3 1 2
3 2 0
3 2 2
3 3 0
3 3 2
3 4 0
3 4 2
3 5 0
3 5 2
3 6 0
3 6 2
3 7 0
3 7 2
3 0 1
3 0 3
3 1 1
3 1 3
3 2 1
3 2 3
3 3 1
3 3 3
3 4 1
3 4 3
3 5 1
3 5 3
3 6 1
3 6 3
3 7 1
3 7 3
4 0 0
4 0 2
4 1 0
4 1 2
4 2 0
4 2 2
4 3 0
4 3 2
4 4 0
4 4 2
4 5 0
4 5 2
4 6 0
4 6 2
4 7 0
4 7 2
4 0 1
4 0 3
4 1 1
4 1 3
4 2 1
4 2 3
4 3 1
4 3 3
4 4 1
4 4 3
4 5 1
4 5 3
4 6 1
4 6 3
4 7 1
4 7 3
5 0 0
5 0 2
5 1 0
5 1 2
5 2 0
5 2 2
5 3 0
5 3 2
5 4 0
5 4 2
5 5 0
5 5 2
5 6 0
5 6 2
5 7 0
5 7 2
5 0 1
5 0 3
5 1 1
5 1 3
5 2 1
5 2 3
5 3 1
5 3 3
5 4 1
5 4 3
5 5 1
5 5 3
5 6 1
5 6 3
5 7 1
5 7 3
6 0 0
6 0 2
6 1 0
6 1 2
6 2 0
6 2 2
6 3 0
6 3 2
6 4 0
6 4 2
6 5 0
6 5 2
6 6 0
6 6 2
6 7 0
6 7 2
6 0 1
6 0 3
6 1 1
6 1 3
6 2 1
6 2 3
6 3 1
6 3 3
6 4 1
6 4 3
6 5 1
6 5 3
6 6 1
6 6 3
6 7 1
6 7 3
7 0 0
7 0 2
7 1 0
7 1 2
7 2 0
7 2 2
7 3 0
7 3 2
7 4 0
7 4 2
7 5 0
7 5 2
7 6 0
7 6 2
7 7 0
7 7 2
7 0 1
7 0 3
7 1 1
7 1 3
7 2 1
7 2 3
7 3 1
7 3 3
7 4 1
7 4 3
7 5 1
7 5 3
7 6 1
7 6 3
7 7 1
7 7 3

In [79]:
imshow(A[:, :, 0], interpolation="none")


Out[79]:
<matplotlib.image.AxesImage at 0x7f95324132d0>

In [80]:
imshow(B, interpolation="none")


Out[80]:
<matplotlib.image.AxesImage at 0x7f95324e0790>

In [81]:
A


Out[81]:
array([[[   0.],
        [   2.],
        [   4.],
        [   6.],
        [   8.],
        [  10.],
        [  12.],
        [  14.],
        [  16.],
        [  18.],
        [  20.],
        [  22.],
        [  24.],
        [  26.],
        [  28.],
        [  30.]],

       [[   1.],
        [   3.],
        [   5.],
        [   7.],
        [   9.],
        [  11.],
        [  13.],
        [  15.],
        [  17.],
        [  19.],
        [  21.],
        [  23.],
        [  25.],
        [  27.],
        [  29.],
        [  31.]],

       [[  32.],
        [  34.],
        [  36.],
        [  38.],
        [  40.],
        [  42.],
        [  44.],
        [  46.],
        [  48.],
        [  50.],
        [  52.],
        [  54.],
        [  56.],
        [  58.],
        [  60.],
        [  62.]],

       [[  33.],
        [  35.],
        [  37.],
        [  39.],
        [  41.],
        [  43.],
        [  45.],
        [  47.],
        [  49.],
        [  51.],
        [  53.],
        [  55.],
        [  57.],
        [  59.],
        [  61.],
        [  63.]],

       [[  64.],
        [  66.],
        [  68.],
        [  70.],
        [  72.],
        [  74.],
        [  76.],
        [  78.],
        [  80.],
        [  82.],
        [  84.],
        [  86.],
        [  88.],
        [  90.],
        [  92.],
        [  94.]],

       [[  65.],
        [  67.],
        [  69.],
        [  71.],
        [  73.],
        [  75.],
        [  77.],
        [  79.],
        [  81.],
        [  83.],
        [  85.],
        [  87.],
        [  89.],
        [  91.],
        [  93.],
        [  95.]],

       [[  96.],
        [  98.],
        [ 100.],
        [ 102.],
        [ 104.],
        [ 106.],
        [ 108.],
        [ 110.],
        [ 112.],
        [ 114.],
        [ 116.],
        [ 118.],
        [ 120.],
        [ 122.],
        [ 124.],
        [ 126.]],

       [[  97.],
        [  99.],
        [ 101.],
        [ 103.],
        [ 105.],
        [ 107.],
        [ 109.],
        [ 111.],
        [ 113.],
        [ 115.],
        [ 117.],
        [ 119.],
        [ 121.],
        [ 123.],
        [ 125.],
        [ 127.]],

       [[ 128.],
        [ 130.],
        [ 132.],
        [ 134.],
        [ 136.],
        [ 138.],
        [ 140.],
        [ 142.],
        [ 144.],
        [ 146.],
        [ 148.],
        [ 150.],
        [ 152.],
        [ 154.],
        [ 156.],
        [ 158.]],

       [[ 129.],
        [ 131.],
        [ 133.],
        [ 135.],
        [ 137.],
        [ 139.],
        [ 141.],
        [ 143.],
        [ 145.],
        [ 147.],
        [ 149.],
        [ 151.],
        [ 153.],
        [ 155.],
        [ 157.],
        [ 159.]],

       [[ 160.],
        [ 162.],
        [ 164.],
        [ 166.],
        [ 168.],
        [ 170.],
        [ 172.],
        [ 174.],
        [ 176.],
        [ 178.],
        [ 180.],
        [ 182.],
        [ 184.],
        [ 186.],
        [ 188.],
        [ 190.]],

       [[ 161.],
        [ 163.],
        [ 165.],
        [ 167.],
        [ 169.],
        [ 171.],
        [ 173.],
        [ 175.],
        [ 177.],
        [ 179.],
        [ 181.],
        [ 183.],
        [ 185.],
        [ 187.],
        [ 189.],
        [ 191.]],

       [[ 192.],
        [ 194.],
        [ 196.],
        [ 198.],
        [ 200.],
        [ 202.],
        [ 204.],
        [ 206.],
        [ 208.],
        [ 210.],
        [ 212.],
        [ 214.],
        [ 216.],
        [ 218.],
        [ 220.],
        [ 222.]],

       [[ 193.],
        [ 195.],
        [ 197.],
        [ 199.],
        [ 201.],
        [ 203.],
        [ 205.],
        [ 207.],
        [ 209.],
        [ 211.],
        [ 213.],
        [ 215.],
        [ 217.],
        [ 219.],
        [ 221.],
        [ 223.]],

       [[ 224.],
        [ 226.],
        [ 228.],
        [ 230.],
        [ 232.],
        [ 234.],
        [ 236.],
        [ 238.],
        [ 240.],
        [ 242.],
        [ 244.],
        [ 246.],
        [ 248.],
        [ 250.],
        [ 252.],
        [ 254.]],

       [[ 225.],
        [ 227.],
        [ 229.],
        [ 231.],
        [ 233.],
        [ 235.],
        [ 237.],
        [ 239.],
        [ 241.],
        [ 243.],
        [ 245.],
        [ 247.],
        [ 249.],
        [ 251.],
        [ 253.],
        [ 255.]]])

In [83]:
B == A[:, :, 0]


Out[83]:
array([[ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True]], dtype=bool)

In [ ]:
def pony2(I, r):
    a, b, c = I.shape
    B = I.reshape(a/r, b/r, r, r).transpose(0, 1, 3, 2)
    B = np.concatenate([B[i] for i in range(8)], axis=1)
    B = B.transpose(1, 2, 0)
    B = np.concatenate([B[:, :, i] for i in range(8)], axis=1)
    return B