That does repeat the elements, but doesn't get them into the desired order.
In [4]: print a [[1 2] [3 4]] In [7]: np.tile(a, 4) Out[7]: array([[1, 2, 1, 2, 1, 2, 1, 2], [3, 4, 3, 4, 3, 4, 3, 4]]) In [8]: np.tile(a, 4).reshape(4,4) Out[8]: array([[1, 2, 1, 2], [1, 2, 1, 2], [3, 4, 3, 4], [3, 4, 3, 4]]) It's close, but I want to repeat the elements along the two axes, effectively stretching it by the lower right corner: array([[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]]) It would take some more reshaping/axis rolling to get there, but it seems doable. Anyone know what combination of manipulations would work with the result of np.tile? -Robin On Dec 3, 2011, at 11:05 AM, Olivier Delalleau wrote: > You can also use numpy.tile > > -=- Olivier > > 2011/12/3 Robin Kraft >> Thanks Warren, this is great, and even handles giant arrays just fine if >> you've got enough RAM. >> >> I also just found this StackOverflow post with another solution. >> >> a.repeat(2, axis=0).repeat(2, axis=1). >> http://stackoverflow.com/questions/7525214/how-to-scale-a-numpy-array >> >> np.kron lets you do more, but for my simple use case the repeat() method is >> faster and more ram efficient with large arrays. >> >> In [3]: a = np.random.randint(0, 255, (2400, 2400)).astype('uint8') >> >> In [4]: timeit a.repeat(2, axis=0).repeat(2, axis=1) >> 10 loops, best of 3: 182 ms per loop >> >> In [5]: timeit np.kron(a, np.ones((2,2), dtype='uint8')) >> 1 loops, best of 3: 513 ms per loop >> >> >> Or for a 43200x4800 array: >> >> In [6]: a = np.random.randint(0, 255, (2400*18, 2400*2)).astype('uint8') >> >> In [7]: timeit a.repeat(2, axis=0).repeat(2, axis=1) >> 1 loops, best of 3: 6.92 s per loop >> >> In [8]: timeit np.kron(a, np.ones((2, 2), dtype='uint8')) >> 1 loops, best of 3: 27.8 s per loop >> >> In this case repeat() peaked at about 1gb of ram usage while np.kron hit >> about 1.7gb. >> >> 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! >> >> -Robin >> >> >> On Dec 3, 2011, at 12:51 AM, Warren Weckesser wrote: >>> On Sat, Dec 3, 2011 at 12:35 AM, Robin Kraft wrote: >>> >>> > I need to take an array - derived from raster GIS data - and upsample or >>> > scale it. That is, I need to repeat each value in each dimension so that, >>> > for example, a 2x2 array becomes a 4x4 array as follows: >>> > >>> > [[1, 2], >>> > [3, 4]] >>> > >>> > becomes >>> > >>> > [[1,1,2,2], >>> > [1,1,2,2], >>> > [3,3,4,4] >>> > [3,3,4,4]] >>> > >>> > It seems like some combination of np.resize or np.repeat and reshape + >>> > rollaxis would do the trick, but I'm at a loss. >>> > >>> > Many thanks! >>> > >>> > -Robin >>> > >>> >>> >>> 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 >> >> >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion