Когда я должен использовать hstack/vstack vs append vs concatenate vs column_stack

Простой вопрос: в чем преимущество каждого из этих методов. Кажется, что, учитывая правильные параметры (и ndarray), все они кажутся одинаково эквивалентными. Выполняйте некоторые работы? имеют лучшую производительность? какие функции следует использовать, когда?

Ответ 1

У вас есть доступ к коду этих функций? Все написаны на Python, кроме np.concatenate. С оболочкой IPython вы просто используете ?? ,

Если нет, вот краткое изложение их кода:

vstack
concatenate([atleast_2d(_m) for _m in tup], 0)
i.e. turn all imputs in to 2d (or more) and concatenate on first

hstack
concatenate([atleast_1d(_m) for _m in tup], axis=<0 or 1>)

colstack
transform arrays with (if needed)
    array(arr, copy=False, subok=True, ndmin=2).T

append
concatenate((asarray(arr), values), axis=axis)

Другими словами, все они работают, настраивая размеры входных массивов, а затем объединяя их по правой оси. Это просто удобные функции.


И более новый np.stack:

arrays = [asanyarray(arr) for arr in arrays]
shapes = set(arr.shape for arr in arrays)
result_ndim = arrays[0].ndim + 1
axis = normalize_axis_index(axis, result_ndim)
sl = (slice(None),) * axis + (_nx.newaxis,)

expanded_arrays = [arr[sl] for arr in arrays]
concatenate(expanded_arrays, axis=axis, out=out)

То есть он расширяет dims всех входных данных (немного похоже на np.expand_dims), а затем объединяет. При axis=0 эффект такой же, как у np.array.

Документация hstack теперь добавляет:

Функции concatenate, stack и block обеспечивают более общие операции суммирования и объединения.

np.block также новый. По сути, он рекурсивно объединяется по вложенным спискам.

Ответ 2

numpy.vstack: стек массивы в последовательности вертикально (строка стрелки).Equivalent к np.concatenate(tup, axis=0) Пример см: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html

numpy.hstack: укладывать массивы в последовательности по горизонтали (по столбцам). Эквивалентно np.concatenate(tup, axis=1), за исключением np.concatenate(tup, axis=1) массивов, где он объединяется вдоль первой оси. пример см.: https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html.

append - это функция для встроенного list структур данных Python. Каждый раз, когда вы добавляете элемент в список. Очевидно, что для добавления нескольких элементов вы будете использовать extend. Проще говоря, функции NumPy гораздо более мощные.

пример:

предположим, серый .shape = (n0, n1)

np.vstack((gray,gray,gray)) будет иметь форму (n0 * 3, n1), вы также можете сделать это с помощью np.concatenate((gray,gray,gray),axis=0)

np.hstack((gray,gray,gray)) будет иметь форму (n0, n1 * 3), вы также можете сделать это с помощью np.concatenate((gray,gray,gray),axis=1)

np.dstack((gray,gray,gray)) будет иметь форму (n0, n1,3).

Ответ 3

В IPython вы можете посмотреть исходный код функции, набрав ее имя, а затем ??. Взглянув на hstack, мы видим, что на самом деле это всего лишь обертка вокруг concatenate (аналогично vstack и column_stack):

np.hstack??
def hstack(tup):
...
    arrs = [atleast_1d(_m) for _m in tup]
    # As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
    if arrs[0].ndim == 1:
        return _nx.concatenate(arrs, 0)
    else:
        return _nx.concatenate(arrs, 1)

Поэтому я предполагаю, что просто используйте то, что имеет для вас наиболее логичное звучание.