Простой вопрос: в чем преимущество каждого из этих методов. Кажется, что, учитывая правильные параметры (и ndarray), все они кажутся одинаково эквивалентными. Выполняйте некоторые работы? имеют лучшую производительность? какие функции следует использовать, когда?
Когда я должен использовать hstack/vstack vs append vs concatenate vs column_stack
Ответ 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)
Поэтому я предполагаю, что просто используйте то, что имеет для вас наиболее логичное звучание.