Коли слід використовувати hstack / vstack vs append vs concatenate vs column_stack?


80

Просте питання: в чому перевага кожного з цих методів. Здається, що з урахуванням правильних параметрів (і форм ndarray) всі вони працюють, здавалося б, однаково. Деякі роботи на місці? Маєте кращі показники? Які функції слід використовувати коли?

Відповіді:


41

Усі функції написані на Python, крім np.concatenate. За допомогою оболонки IPython ви просто використовуєте ??.

Якщо ні, ось короткий опис їх коду:

vstack
concatenate([atleast_2d(_m) for _m in tup], 0)
i.e. turn all inputs 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)

Тобто він розширює затемнення всіх входів (трохи як np.expand_dims), а потім об'єднує. З axis=0, ефект такий же, як np.array.

hstack Документація тепер додає:

Функції concatenate, stackі blockзабезпечують більш загальні штабелировании і конкатенацію операції.

np.blockтакож є новим. По суті, він рекурсивно об’єднується по вкладених списках.


21

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

numpy.hstack: Складайте масиви послідовно по горизонталі (по стовпцях). Еквівалент np.concatenate(tup, axis=1), за винятком одновимірних масивів, де вони об'єднуються вздовж першої осі. приклад див .: https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html

append - це функція для вбудованої структури даних python list. Кожного разу, коли ви додаєте елемент до списку. Очевидно, що для додавання декількох елементів ви будете використовувати extend. Простіше кажучи, функції numpy набагато потужніші.

приклад:

припустимо сірий. форма = (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).


14

В 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)

Тож я думаю, просто використовуйте те, яке з них має найбільш логічне звучання для вас.


3

Якщо у вас є дві матриці, ви добре йти тільки з hstackі vstack:

Якщо ви складаєте матрицю та вектор, hstackстає складним у використанні, тому column_stackє кращий варіант:

Якщо ви складаєте два вектори, у вас є три варіанти:

І concatenateв необробленому вигляді це корисно для 3D і вище, детальніше див. Мою статтю Numpy Illustrated .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.