Numpy объединяет два массива по вертикали
Я попробовал следующее:
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> np.concatenate((a,b), axis=0)
array([1, 2, 3, 4, 5, 6])
>>> np.concatenate((a,b), axis=1)
array([1, 2, 3, 4, 5, 6])
Однако, я ожидаю, что, по крайней мере, один результат будет выглядеть следующим образом:
array([[1, 2, 3],
[4, 5, 6]])
Почему это не конкатенировано по вертикали?
Ответы
Ответ 1
Поскольку как a
, так и b
имеют только одну ось, так как их форма (3)
, а параметр оси конкретно относится к оси элементов для конкатенации.
В этом примере следует прояснить, что делает concatenate
с осью. Возьмите два вектора с двумя осями, с формой (2,3)
:
a = np.array([[1,5,9],[2,6,10]])
b = np.array([[3,7,11],[4,8,12]])
объединяется вдоль 1-й оси (строки 1-го, затем строки 2-го):
print concatenate((a,b),axis=0)
array([[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11],
[ 4, 8, 12]])
объединяется вдоль 2-й оси (столбцы 1-го, затем столбцы 2-го):
print concatenate((a,b),axis=1)
array([[ 1, 5, 9, 3, 7, 11],
[ 2, 6, 10, 4, 8, 12]])
чтобы получить вывод, который вы представили, вы можете использовать
a = np.array([1,2,3])
b = np.array([4,5,6])
vstack((a,b))
Вы все еще можете сделать это с помощью concatenate, но это займет больше времени:
a=a.reshape(1,3)
b=b.reshape(1,3)
print concatenate((a,b))
Ответ 2
Незначительная функция numpy заключается в использовании r_
. Это простой способ быстро создать массивы:
import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.r_[a[None,:],b[None,:]]
print(c)
#[[1 2 3]
# [4 5 6]]
Цель a[None,:]
- добавить ось к массиву a
.
Ответ 3
Если фактическая проблема заключается в объединении двух массивов с 1-D по вертикали, и мы не фиксируем использование concatenate
для выполнения этой операции, я бы предложил использовать np.column_stack:
In []: a = np.array([1,2,3])
In []: b = np.array([4,5,6])
In []: np.column_stack((a, b))
array([[1, 4],
[2, 5],
[3, 6]])
Ответ 4
a = np.array([1,2,3])
b = np.array([4,5,6])
np.array((a,b))
работает так же хорошо, как
np.array([[1,2,3], [4,5,6]])
Независимо от того, является ли список списков или список массивов 1d, np.array
пытается создать массив 2d.
Но также полезно понять, как работают np.concatenate
и его семейство функций stack
. В этом контексте concatenate
нужен список 2d-массивов (или любое другое, что np.array
превратится в 2d-массив) в качестве входов.
np.vstack
сначала петли, хотя входы, удостоверяющие, что они не менее 2d, затем объединяются. Функционально это то же самое, что и сами размеры массивов.
np.stack
- это новая функция, которая объединяет массивы в новом измерении. По умолчанию выполняется так же, как np.array
.
Посмотрите на код этих функций. Если вы написали на Python, вы можете узнать немного. Для vstack
:
return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)