Ah sorry, I hadn't read carefully enough what you were trying to achieve. I think the double repeat solution looks like your best option then.
-=- Olivier
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?-RobinOn Dec 3, 2011, at 11:05 AM, Olivier Delalleau wrote:You can also use numpy.tile
-=- Olivier2011/12/3 Robin KraftThanks 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).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 loopIn [5]: timeit np.kron(a, np.ones((2,2), dtype='uint8'))1 loops, best of 3: 513 ms per loopOr 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 loopIn [8]: timeit np.kron(a, np.ones((2, 2), dtype='uint8'))1 loops, best of 3: 27.8 s per loopIn 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!-RobinOn 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