<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>That does repeat the elements, but doesn't get them into the desired order.</div><div><br></div><div><div><font class="Apple-style-span" face="'Courier New'">In [4]: 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'"><div>In [7]: np.tile(a, 4)</div><div>Out[7]: </div><div>array([[1, 2, 1, 2, 1, 2, 1, 2],</div><div>       [3, 4, 3, 4, 3, 4, 3, 4]])</div><div><br></div><div>In [8]: np.tile(a, 4).reshape(4,4)</div><div>Out[8]: </div><div>array([[1, 2, 1, 2],</div><div>       [1, 2, 1, 2],</div><div>       [3, 4, 3, 4],</div><div>       [3, 4, 3, 4]])</div><div><br></div></font></div></div><div>It's close, but I want to repeat the elements along the two axes, effectively stretching it by the lower right corner:</div><div><br></div><div style="font-family: 'Courier New'; ">array([[1, 1, 2, 2],</div><div style="font-family: 'Courier New'; ">       [1, 1, 2, 2],</div><div style="font-family: 'Courier New'; ">       [3, 3, 4, 4],</div><div><span class="Apple-style-span" style="font-family: 'Courier New'; ">       [3, 3, 4, 4]])</span></div><div><br></div><div>It would take some more reshaping/axis rolling to get there, but it seems doable.</div><div><br></div><div>Anyone know what combination of manipulations would work with the result of np.tile?</div><div><br></div><div>-Robin</div><div><br></div><div><br></div><div><br></div>On Dec 3, 2011, at 11:05 AM, Olivier Delalleau wrote:<div><br></div><div><blockquote type="cite"><div>You can also use numpy.tile<br><br>-=- Olivier<br><br></div><div>2011/12/3 Robin Kraft</div></blockquote></div><div><div></div><blockquote type="cite"><div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Thanks Warren, this is great, and even handles giant arrays just fine if you've got enough RAM.<div><br></div><div><div>I also just found this StackOverflow post with another solution.</div><div><br></div><div><div>a.repeat(2, axis=0).repeat(2, axis=1). </div></div><div><a href="http://stackoverflow.com/questions/7525214/how-to-scale-a-numpy-array">http://stackoverflow.com/questions/7525214/how-to-scale-a-numpy-array</a></div><div><br></div><div>np.kron lets you do more, but for my simple use case the repeat() method is faster and more ram efficient with large arrays.</div></div><div><br></div><div><div>In [3]: a = np.random.randint(0, 255, (2400, 2400)).astype('uint8')</div><div><br></div><div>In [4]: timeit a.repeat(2, axis=0).repeat(2, axis=1)</div><div>10 loops, best of 3: 182 ms per loop</div><div><br></div><div>In [5]: timeit np.kron(a, np.ones((2,2), dtype='uint8'))</div><div>1 loops, best of 3: 513 ms per loop</div></div><div><br></div><div><br></div><div><div>Or for a 43200x4800 array:</div><div><br></div><div><div>In [6]: a = np.random.randint(0, 255, (2400*18, 2400*2)).astype('uint8')</div><div><br></div><div>In [7]: timeit a.repeat(2, axis=0).repeat(2, axis=1)</div><div>1 loops, best of 3: 6.92 s per loop</div></div><div><br></div><div><div>In [8]: timeit np.kron(a, np.ones((2, 2), dtype='uint8'))</div><div>1 loops, best of 3: 27.8 s per loop</div></div><div><br></div><div><div>In this case repeat() peaked at about 1gb of ram usage while np.kron hit about 1.7gb.</div><div><br></div><div>Thanks again Warren. I'd tried way too many variations on reshape and rollaxis, and should have come to the Numpy list a lot sooner!</div><div><br></div><div>-Robin</div><div><br></div><div><br></div><div><div>On Dec 3, 2011, at 12:51 AM, Warren Weckesser wrote:</div><blockquote type="cite"><pre style="color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); position: static; z-index: auto; ">On Sat, Dec 3, 2011 at 12:35 AM, Robin Kraft wrote:

><i> I need to take an array - derived from raster GIS data - and upsample or
</i>><i> scale it. That is, I need to repeat each value in each dimension so that,
</i>><i> for example, a 2x2 array becomes a 4x4 array as follows:
</i>><i>
</i>><i> [[1, 2],
</i>><i>  [3, 4]]
</i>><i>
</i>><i> becomes
</i>><i>
</i>><i> [[1,1,2,2],
</i>><i>  [1,1,2,2],
</i>><i>  [3,3,4,4]
</i>><i>  [3,3,4,4]]
</i>><i>
</i>><i> It seems like some combination of np.resize or np.repeat and reshape +
</i>><i> rollaxis would do the trick, but I'm at a loss.
</i>><i>
</i>><i> Many thanks!
</i>><i>
</i>><i> -Robin
</i>><i>
</i>

Just a day or so ago, Josef Perktold showed one way of accomplishing this
using numpy.kron:

In [14]: a = arange(12).reshape(3,4)

In [15]: a
Out[15]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [16]: kron(a, ones((2,2)))
Out[16]:
array([[  0.,   0.,   1.,   1.,   2.,   2.,   3.,   3.],
       [  0.,   0.,   1.,   1.,   2.,   2.,   3.,   3.],
       [  4.,   4.,   5.,   5.,   6.,   6.,   7.,   7.],
       [  4.,   4.,   5.,   5.,   6.,   6.,   7.,   7.],
       [  8.,   8.,   9.,   9.,  10.,  10.,  11.,  11.],
       [  8.,   8.,   9.,   9.,  10.,  10.,  11.,  11.]])


Warren</pre></blockquote><div><br></div></div><br>
</div></div></div></blockquote></div><br></blockquote></div></body></html>