I would like to scale an array of shape (h, w) by a factor of n, resulting in an array of shape (h*n, w*n), with the.
Say that I have a 2x2 array:
array([[1, 1],
[0, 1]])
I would like to scale the array to become 4x4:
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 1, 1],
[0, 0, 1, 1]])
That is, the value of each cell in the original array is copied into 4 corresponding cells in the resulting array. Assuming arbitrary array size and scaling factor, what's the most efficient way to do this?
You could use
repeat
:I am not sure if there's a neat way to combine the two operations into one.
You should use the Kronecker product, numpy.kron:
which gives what you want:
To scale effectively I use following approach. Works 5 times faster than
repeat
and 10 times faster thatkron
. First, initialise target array, to fill scaled array in-place. And predefine slices to win few cycles:Now this function will do the scale:
Or the same thing simply in one function:
scipy.misc.imresize
can scale images. It can be used to scale numpy arrays, too: