2017-02-10 4 views
0

Почему numpy documentation рекомендуем предпочесть concatente over hstack?Почему документация numpy рекомендует предпочитать concatente по hstack?

, но вы должны предпочесть np.concatenate или np.stack.

Согласно this answer hstack - обертка вокруг конкатенации. В таком случае почему бы не использовать hstack, который улучшает читаемость кода?

+0

Еще один кадр в стеке вызовов? – wim

+1

Потому что, если вы попытаетесь понять их обоих, вам может быть не так о «удобочитаемости» и о производительности? – Divakar

+1

Вероятно, потому что семантика более ясна для размеров массива, отличных от 2. – user2357112

ответ

0

Таким образом, фактический код в hstack является:

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) 

Сначала он петлями через аргументы и убеждается, что каждый из них по крайней мере, 1д. Это касается 0d и скалярных элементов, например, в np.hstack([0,1,np.arange(3)]).

Остальное выбирает между конкатенированием на одной и только осевой или второй.

vstack аналогичный, за исключением того, что он делает вещи по крайней мере 2d и объединяет 1-й.

Судя по ответам на вопросы/ответы, они все еще используются довольно много, и я думаю, что в большинстве случаев они не вызывают проблем. Это np.append, что создает большинство проблем. Это то, чего я бы хотел, чтобы они никогда не добавляли.

Я думаю, что главная проблема с hstack и vstack заключается в том, что они поощряют (или, по крайней мере, допускают) ленивое мышление о размерах и формах. Когда возникают вопросы, это связано с тем, что плакат не понимает, что означает иметь одинаковое количество измерений или что фигуры должны быть равными (за исключением одной оси).