Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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)

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