In python need to combine two 2-dimensional numpy arrays, so that the resulting rows are combinations of the rows from the input arrays concatenated together. I need the fastest solution so it can be used in arrays that are very big.
For example:
I got:
import numpy as np array1 = np.array([[1,2],[3,4]]) array2 = np.array([[5,6],[7,8]])
I want the code to return:
[[1,2,5,6] [1,2,7,8] [3,4,5,6] [3,4,7,8]]
Answer
Solution using numpy’s repeat
, tile
and hstack
The snippet
result = np.hstack([ np.repeat(array1, array2.shape[0], axis=0), np.tile(array2, (array1.shape[0], 1)) ])
Step by step explanation
We start with the two arrays, array1
and array2
:
import numpy as np array1 = np.array([[1,2],[3,4]]) array2 = np.array([[5,6],[7,8]])
First, we duplicate the content of array1
using repeat
:
a = np.repeat(array1, array2.shape[0], axis=0)
The content of a
is:
array([[1, 2], [1, 2], [3, 4], [3, 4]])
Then we repeat the second array, array2
, using tile
. In particular, (array1.shape[0],1)
replicates array2
in the first direction array1.shape[0]
times and just 1
time in the other direction.
b = np.tile(array2, (array1.shape[0],1))
The result is:
array([[5, 6], [7, 8], [5, 6], [7, 8]])
Now we can just proceed to stack the two results, using hstack
:
result = np.hstack([a,b])
Achieving the desired output:
array([[1, 2, 5, 6], [1, 2, 7, 8], [3, 4, 5, 6], [3, 4, 7, 8]])