Просте питання: в чому перевага кожного з цих методів. Здається, що з урахуванням правильних параметрів (і форм ndarray) всі вони працюють, здавалося б, однаково. Деякі роботи на місці? Маєте кращі показники? Які функції слід використовувати коли?
Просте питання: в чому перевага кожного з цих методів. Здається, що з урахуванням правильних параметрів (і форм ndarray) всі вони працюють, здавалося б, однаково. Деякі роботи на місці? Маєте кращі показники? Які функції слід використовувати коли?
Відповіді:
Усі функції написані на 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
також є новим. По суті, він рекурсивно об’єднується по вкладених списках.
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).
В 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)
Тож я думаю, просто використовуйте те, яке з них має найбільш логічне звучання для вас.
Якщо у вас є дві матриці, ви добре йти тільки з hstack
і vstack
:
Якщо ви складаєте матрицю та вектор, hstack
стає складним у використанні, тому column_stack
є кращий варіант:
Якщо ви складаєте два вектори, у вас є три варіанти:
І concatenate
в необробленому вигляді це корисно для 3D і вище, детальніше див. Мою статтю Numpy Illustrated .