Посмотрите на эти массивы:
In [26]: A
Out[26]: array([1, 2, 3])
In [27]: B
Out[27]:
array([[4, 5],
[6, 7],
[8, 9]])
In [28]: A[:,None]
Out[28]:
array([[1],
[2],
[3]])
In [31]: np.concatenate([A[:,None],B],axis=1)
Out[31]:
array([[1, 4, 5],
[2, 6, 7],
[3, 8, 9]])
Разве это не имеет смысла, что если вы хотите присоединиться к 3 предметов A
в 3 ряда B
, что A
также должен иметь 3 строки?
Большая разница между numpy
и MATLAB заключается в том, что в MATLAB все равно 2d (или выше). В массивах numpy может быть 1d и разностные матрицы. Сравнение
Октава:
>> A=[1,2,3]
A =
1 2 3
>> B=[4,5;6,7;8,9]
B =
4 5
6 7
8 9
The (1,3) не может быть соединена с (3,2) матрицы в любом направлении:
>> cat(1,A,B)
error: cat: dimension mismatch
>> cat(2,A,B)
error: cat: dimension mismatch
Но это работает, если я транспонировать A
:
>> cat(2,A.',B)
ans =
1 4 5
2 6 7
3 8 9
Таким образом, даже при использовании 2-й базовой линии размеры должны соответствовать.
Все hstack
добавлено к concatenate
: atleast_1d
, что в данном случае не помогает. np.column_stack
делает его 2d и .T, поэтому он работает.Я рекомендую посмотреть базовый код для таких функций, как hstack
и column_stack
(у вас, возможно, уже есть привычка от MATLAB).
==================
Ваш комментарий о разнице между hstack
и column_stack
. У них нет особых ограничений, скорее они просто делают разные вещи, чтобы приспособить размеры своих входных данных. Ничто не делает ничего глубокого или загадочного.
def hstack(tup):
arrs = [np.atleast_1d(m) for m in tup]
return np.concatenate(arrs, 0) # used when A is first
# return np.concatenate(arrs, 1) # used when B is first
Поскольку оба массива по крайней мере 1d, первый шаг ничего не добавляет. Так что это просто вопрос того, чтобы пытаться сделать
np.concatenate((A,B), axis=0) # or axis=1
В любом случае пытается сцепить (3,) массив в (3,2) не работает - один 1d, другой 2d. A (3,1) с (3,2) работает, если вы хотите (3,3). В этом случае A.ndim<2
; шаг array
превращает A
в (1,3), а T
изменяет его на (3,1). Это то же самое, что и A[:,None]
.
Значит, это np.concatenate
, что накладывает ограничения - сопоставление ndim
и соответствующий размер по соответствующему размеру. Функции stack
являются просто удобными инструментами и не делают ничего, что вы не можете сделать напрямую.
В случае, если кто хочет ссылке: // документы .scipy.org/doc/numpy-1.10.1/reference/generated/numpy.hstack.html – zachyee
Чтобы понять, я понимаю, что hstack принимает только массивы определенной формы. Я пытаюсь понять, ПОЧЕМУ существуют отдельные функции hstack и column_stack, которые имеют эти ограничения. – DataOR
Я попытался объяснить больше того, что делают hstack и 'column_stack'. – hpaulj