Подтвердить что ты не робот

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]])

Почему это не конкатенировано по вертикали?

4b9b3361

Ответ 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)