2014-02-19 3 views
40

Я попробовал следующее: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]]) 

Почему не сцеплены вертикально?

+2

странный !!! Вы можете использовать 'np.vstack ((a, b))' для этой цели (если вы этого не знаете) –

ответ

52

Потому что как 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)) 

Вы все еще можете сделать это с СЦЕПИТЬ, но это займет больше времени:

a=a.reshape(1,3) 
b=b.reshape(1,3) 
print concatenate((a,b)) 
+0

вы уверены, что перестройка будет работать? Это не сработало для меня. –

+5

Попробуйте 'np.concatenate ([a [None,:], b [None,:]])' – wim

+0

@wim: это сработало –

9

А, не хорошо известна особенность 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.

1
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) 
9

Если актуальная проблема под рукой, чтобы объединить две 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]]) 
Смежные вопросы