Numpy: Веселый встэк

Созданный на 22 июл. 2020  ·  7Комментарии  ·  Источник: numpy/numpy

Из 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) .

33 - Question

Все 7 Комментарий

Мы не поощряем 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 , но, вероятно, в рамках того, чтобы не отпугивать их активно от использования этих функций.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

keithbriggs picture keithbriggs  ·  3Комментарии

astrofrog picture astrofrog  ·  4Комментарии

toddrjen picture toddrjen  ·  4Комментарии

marcocaccin picture marcocaccin  ·  4Комментарии

manuels picture manuels  ·  3Комментарии