Ваши массивы (заменяя i
на целые числа, чтобы сделать дисплей более компактным):
In [230]: u = np.array([[1,2,3],[3,4,5]])
...: i = np.random.randint(0,10,(3,4))*10
In [231]: u
Out[231]:
array([[1, 2, 3],
[3, 4, 5]])
In [232]: i
Out[232]:
array([[40, 20, 40, 10],
[20, 10, 90, 50],
[50, 10, 10, 30]])
Сделайте целевой массив - 3d:
In [233]: res1 = np.zeros((2,3,7))
Измените (2 , 3) u
в (2,1,3), и пусть широковещательная рассылка расширяет его до (2,3,3):
In [234]: res1[:,:,:3]=u[:,None,:]
Затем транслирует (3,4) i
на (2,3,4) slot
In [235]: res1[:,:,3:]=i[None,:,:] # None is optional here
In [236]: res1
Out[236]:
array([[[ 1., 2., 3., 40., 20., 40., 10.],
[ 1., 2., 3., 20., 10., 90., 50.],
[ 1., 2., 3., 50., 10., 10., 30.]],
[[ 3., 4., 5., 40., 20., 40., 10.],
[ 3., 4., 5., 20., 10., 90., 50.],
[ 3., 4., 5., 50., 10., 10., 30.]]])
, затем измените форму на (6,7):
In [237]: res1.reshape(-1,7)
Out[237]:
array([[ 1., 2., 3., 40., 20., 40., 10.],
[ 1., 2., 3., 20., 10., 90., 50.],
[ 1., 2., 3., 50., 10., 10., 30.],
[ 3., 4., 5., 40., 20., 40., 10.],
[ 3., 4., 5., 20., 10., 90., 50.],
[ 3., 4., 5., 50., 10., 10., 30.]])
Все значения должны быть int или float. (Объект dtype допускает смешивание, но математика для такого массива медленнее.)
Я не могу сказать, какой подход самый быстрый. Один может быть лучшим для таких небольших примеров (я делаю ставку на itertools), а другой (мой?) - для больших случаев.