<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Ha! I knew it had to be possible! Thanks Derek. So for and N = 2 (now on my laptop):<div><br></div><div><font class="Apple-style-span" face="'Courier New'">In [70]: M = 1200</font></div><div><font class="Apple-style-span" face="'Courier New'">In [69]: N = 2</font></div><div><font class="Apple-style-span" face="'Courier New'">In [71]: a = np.random.randint(0, 255, (M**2)).reshape(M,-1)<br></font><div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">In [76]: timeit np.rollaxis(np.tile(a, N**2).reshape(M,N,-1), 2, 1).reshape(M*N,-1)</font></div><div><font class="Apple-style-span" face="'Courier New'">10 loops, best of 3: 99.1 ms per loop</font></div></div><div><font class="Apple-style-span" face="'Courier New'"><div><br></div><div>In [78]: timeit a.repeat(2, axis=0).repeat(2, axis=1)</div><div>10 loops, best of 3: 85.6 ms per loop</div><div><br></div><div><div>In [79]: timeit np.kron(a, np.ones((2,2), 'uint8'))</div><div>1 loops, best of 3: 521 ms per loop</div></div></font></div><div><br></div><div>It turns out np.kron and repeat are pretty straightforward for multi-dimensional data too - scaling or stretching a stacked array representing pixel data over time, for example. Nothing changes for np.kron - it handles the additional dimensionality by itself. With repeat you just tell it to operate on the last two dimensions.<div><br></div><div>So to sum up:</div><div><br></div><div>1) np.kron is cool for the simplicity of the code and simple scaling to N dimensions. It's also handy if you want to scale the array elements themselves too.</div><div>2) repeat() along the last N axes is a bit more intuitive (i.e. less magical) to me and has a better performance profile. </div><div>3) Derek's reshape/rolling solution is almost as fast but it gives me a headache trying to visualize what it's actually doing. I don't want to think about adding another dimension ...</div><div><br></div><div>Thanks for the help folks. Here's scaling of a hypothetical time series (i.e. 3 axes), where each sub-array represents a month.</div><div><div><div><br></div><div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">In [26]: print a</font></div><div><font class="Apple-style-span" face="'Courier New'">[[[1 2]</font></div><div><font class="Apple-style-span" face="'Courier New'">  [3 4]]</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'"> [[1 2]</font></div><div><font class="Apple-style-span" face="'Courier New'">  [3 4]]</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'"> [[1 2]</font></div><div><font class="Apple-style-span" face="'Courier New'">  [3 4]]]</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><div><font class="Apple-style-span" face="'Courier New'">In [27]: np.kron(a, np.ones((2,2), dtype='uint8'))</font></div><div><font class="Apple-style-span" face="'Courier New'">Out[27]: </font></div><div><font class="Apple-style-span" face="'Courier New'"><div>array([[[1, 1, 2, 2],</div><div>        [1, 1, 2, 2],</div><div>        [3, 3, 4, 4],</div><div>        [3, 3, 4, 4]],</div><div><br></div><div>       [[1, 1, 2, 2],</div><div>        [1, 1, 2, 2],</div><div>        [3, 3, 4, 4],</div><div>        [3, 3, 4, 4]],</div><div><br></div><div>       [[1, 1, 2, 2],</div><div>        [1, 1, 2, 2],</div><div>        [3, 3, 4, 4],</div><div>        [3, 3, 4, 4]]])</div><div><br></div></font></div></div><div><font class="Apple-style-span" face="'Courier New'"><div>In [64]: a.repeat(2, axis=1).repeat(2, axis=2)</div><div>Out[64]: </div><div>array([[[1, 1, 2, 2],</div><div>        [1, 1, 2, 2],</div><div>        [3, 3, 4, 4],</div><div>        [3, 3, 4, 4]],</div><div><br></div><div>       [[1, 1, 2, 2],</div><div>        [1, 1, 2, 2],</div><div>        [3, 3, 4, 4],</div><div>        [3, 3, 4, 4]],</div><div><br></div><div>       [[1, 1, 2, 2],</div><div>        [1, 1, 2, 2],</div><div>        [3, 3, 4, 4],</div><div>        [3, 3, 4, 4]]])</div></font></div><div><div><br></div><div>On Dec. 3, 2011, at 12:50PM, Derek Homeier wrote:</div><div><br></div><div><blockquote type="cite"><div><font class="Apple-style-span" color="#000000">On 03.12.2011, at 6:22PM, Robin Kraft wrote:</font></div><div><font class="Apple-style-span" color="#000000"><br></font></div><div><font class="Apple-style-span" color="#000000">> That does repeat the elements, but doesn't get them into the desired order.</font></div><div><font class="Apple-style-span" color="#000000">> </font></div><div><font class="Apple-style-span" color="#000000">> In [4]: print a</font></div><div><font class="Apple-style-span" color="#000000">> [[1 2]</font></div><div><font class="Apple-style-span" color="#000000">>  [3 4]]</font></div><div><font class="Apple-style-span" color="#000000">> </font></div><div><font class="Apple-style-span" color="#000000">> In [7]: np.tile(a, 4)</font></div><div><font class="Apple-style-span" color="#000000">> Out[7]: </font></div><div><font class="Apple-style-span" color="#000000">> array([[1, 2, 1, 2, 1, 2, 1, 2],</font></div><div><font class="Apple-style-span" color="#000000">>        [3, 4, 3, 4, 3, 4, 3, 4]])</font></div><div><font class="Apple-style-span" color="#000000">> </font></div><div><font class="Apple-style-span" color="#000000">> In [8]: np.tile(a, 4).reshape(4,4)</font></div><div><font class="Apple-style-span" color="#000000">> Out[8]: </font></div><div><font class="Apple-style-span" color="#000000">> array([[1, 2, 1, 2],</font></div><div><font class="Apple-style-span" color="#000000">>        [1, 2, 1, 2],</font></div><div><font class="Apple-style-span" color="#000000">>        [3, 4, 3, 4],</font></div><div><font class="Apple-style-span" color="#000000">>        [3, 4, 3, 4]])</font></div><div><font class="Apple-style-span" color="#000000">> </font></div><div><font class="Apple-style-span" color="#000000">> It's close, but I want to repeat the elements along the two axes, effectively stretching it by the lower right corner:</font></div><div><font class="Apple-style-span" color="#000000">> </font></div><div><font class="Apple-style-span" color="#000000">> array([[1, 1, 2, 2],</font></div><div><font class="Apple-style-span" color="#000000">>        [1, 1, 2, 2],</font></div><div><font class="Apple-style-span" color="#000000">>        [3, 3, 4, 4],</font></div><div><font class="Apple-style-span" color="#000000">>        [3, 3, 4, 4]])</font></div><div><font class="Apple-style-span" color="#000000">> </font></div><div><font class="Apple-style-span" color="#000000">> It would take some more reshaping/axis rolling to get there, but it seems doable.</font></div><div><font class="Apple-style-span" color="#000000">> </font></div><div><font class="Apple-style-span" color="#000000">> Anyone know what combination of manipulations would work with the result of np.tile?</font></div><div><font class="Apple-style-span" color="#000000">> </font></div><div><font class="Apple-style-span" color="#000000">Rolling was the keyword:</font></div><div><font class="Apple-style-span" color="#000000"><br></font></div><div><font class="Apple-style-span" color="#000000">np.rollaxis(np.tile(a, 4).reshape(2,2,-1), 2, 1).reshape(4,4))</font></div><div><font class="Apple-style-span" color="#000000">[[1 1 2 2]</font></div><div><font class="Apple-style-span" color="#000000"> [1 1 2 2]</font></div><div><font class="Apple-style-span" color="#000000"> [3 3 4 4]</font></div><div><font class="Apple-style-span" color="#000000"> [3 3 4 4]]</font></div><div><font class="Apple-style-span" color="#000000"><br></font></div><div><font class="Apple-style-span" color="#000000">I leave the generalisation and timing up to you, but it seems for </font></div><div><font class="Apple-style-span" color="#000000">a = np.arange(M**2).reshape(M,-1)</font></div><div><font class="Apple-style-span" color="#000000"><br></font></div><div><font class="Apple-style-span" color="#000000">np.rollaxis(np.tile(a, N**2).reshape(M,N,-1), 2, 1).reshape(M*N,-1) </font></div><div><font class="Apple-style-span" color="#000000"><br></font></div><div><font class="Apple-style-span" color="#000000">should do the trick.</font></div><div><font class="Apple-style-span" color="#000000"><br></font></div><div><font class="Apple-style-span" color="#000000">Cheers,</font></div><div><font class="Apple-style-span" color="#000000"><span class="Apple-tab-span" style="white-space:pre">                                                </span>Derek</font></div></blockquote></div></div></div></div></div></div></div></body></html>