Из vstack
docs:
Подпись:
hstack(tup)
Строка документации:
Сложите массивы последовательно по горизонтали (по столбцам).Это эквивалентно объединению по второй оси, за исключением 1-D
массивы, в которых он соединяется по первой оси.
У меня вопрос, почему исключение ???
У нас уже есть concatenate()
.
v = rand(5)
concatenate((v, v)).shape
(10,)
hstack((v, v)).shape
(10,)
stack((v, v), axis=1).shape
(5, 2)
vstack((v, v)).shape
(2, 5)
stack((v, v), axis=0).shape
(2, 5)
Было бы гораздо разумнее иметь vstack = stack(axis=1)
.
Мы не поощряем hstack / vstack / dstack, а вместо этого специально поощряем np.stack
. Однако разница в том, что вы передаете двумерный массив. Некоторые из функций стека вставляют новые измерения (для определенных воплощений), я думаю, hstack
нет.
Добавление последнего предложения о том, что предпочтительным API-интерфейсом является np.concatenate
или np.stack
(обычно), было бы хорошо, но я не думаю, что мы действительно стремимся к удалению функций.
Мой вопрос: почему это исключение? ???
Просто потому, что @seberg прямо не ответил на это:
Одномерные массивы обычно рассматриваются как «горизонтальные» в numpy, а не как «вертикальные». Например, при трансляции массива (N, N)
2D с массивом (N,)
1D массив 1D транслируется на (1, N)
, а не на (N, 1)
. hstack()/vstack()/dstack()
построены не на концепциях постоянных осей (вы можете использовать stack()
если хотите), а на концепциях «горизонталь / вертикаль / глубина», которые не отображаются точно на фиксированные оси для все размерности массива.
Я -1 за язык, который не одобряет hstack()/vstack()/dstack()
как таковой. Я все еще думаю, что они хороши и полезны из-за исключений в их семантике. Они фиксируют концепции, которые не отражены кратко stack()
.
Например, часто бывает необходимо добавить или добавить скалярное значение к одномерному массиву. np.hstack([0.0, some_vector])
отлично подходит для этого. np.stack([0.0, some_vector])
и np.concatenate([0.0, some_vector])
возражают, потому что они не имеют одинаковой размерности.
Правда, я думаю, что эти инструменты просто немного связаны с работой в определенном контексте. Так что давайте просто закроем это. У нас есть общие инструменты без «фанкового» поведения, а остальные остаются там, пока они не станут хорошими утилитами.
@rkern , то concatenate
требует исправления, ИМХО. Укладка означает объединение после добавления дополнительного затемнения, что здесь не соблюдается. Но ладно ...
@seberg , похоже, здесь будет приветствоваться предупреждение об устаревании. Одномерный массив не является ни горизонтальным, ни вертикальным. И hstack
возвращается к concatenate
, забывая добавить дополнительное измерение. Это действительно выглядит "напуганным". Но если вы не собираетесь обсуждать, что ж ...
Все другие функции ?stack
также добавляют дополнительные затемнения только тогда, когда они ниже, чем необходимо для выполнения операции прямо сейчас. В данном случае это только 0d.
@Atcold Я открыт для предложений подтолкнуть пользователей к stack
, но, вероятно, в рамках того, чтобы не отпугивать их активно от использования этих функций.