Николай показал правильный способ сделать это, но я подозреваю, что вам нужна небольшая помощь в понимании, почему. Вы попробовали несколько вещей, не сказав нам, что случилось.
In [241]: array_a = np.array([1,2,3])
...: array_b = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])
vstack
выполняется:
In [242]: np.vstack((array_a, array_b))
Out[242]:
array([[ 1, 2, 3],
[10, 11, 12],
[20, 21, 22],
[30, 31, 32]])
Но результатом является вертикальное соединение по строкам, а не по столбцам. v
в vstack
должно напоминать нам об этом.
stack
пытается объединить массивы по оси new и требует, чтобы все входные массивы имели совпадающиеshape:
In [243]: np.stack((array_a, array_b))
...
ValueError: all input arrays must have the same shape
Я подозреваю, что вы попробовали это наугад, не читая документы.
Оба они используют concatenate
, который является основным столяром. Но он требователен к размерам:
In [244]: np.concatenate((array_a, array_b))
...
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 1 dimension(s) and the array at index 1 has 2 dimension(s)
Вы ясно поняли, что число измерений не совпадает.
Вы хотите создать массив (3,4). Один из них (3,3), другой должен быть (3,1). И ось соединения должна быть 1
In [247]: np.concatenate((array_a[:,None], array_b), axis=1)
Out[247]:
array([[ 1, 10, 11, 12],
[ 2, 20, 21, 22],
[ 3, 30, 31, 32]])
Если мы создали массив (1,3) и попытались объединить по оси 0 по умолчанию, мы получим то же самое, что и vstack
. Фактически это то, что vstack
делает:
In [248]: np.concatenate((array_a[None,:], array_b))
Out[248]:
array([[ 1, 2, 3],
[10, 11, 12],
[20, 21, 22],
[30, 31, 32]])
Другая функция:
In [249]: np.column_stack((array_a, array_b))
Out[249]:
array([[ 1, 10, 11, 12],
[ 2, 20, 21, 22],
[ 3, 30, 31, 32]])
Это то же самое, что и [247].
Функции типа vstack
и column_stack
удобны, но в долгосрочной перспективе лучше понять, как использовать concatenate
.