#python #numpy #vstack
#python #numpy #vstack
Вопрос:
Здесь новичок в Python.
После просмотра документации numpy, в которой говорится, что vstack эквивалентен конкатенации вдоль первой оси после того, как одномерные массивы формы (N,) были изменены на (1,N) .
Итак, приведенный ниже код
a = np.array([[1], [2], [3]])
b = np.array([[2], [3], [4]])
np.vstack((a,b))
должно быть
np.concatenate((a,b),axis=0))
После изменения формы всех одномерных массивов с (1,) на (1,1)
a будет
[[[1]]
[[2]]
[[3]]]
b будет
[[[2]]
[[3]]
[[4]]]
Итак,
np.concatenate((a,b),axis=0)
должно быть
[[[1]]
[[2]]
[[3]]
[[2]]
[[3]]
[[4]]]
но результат показывает
[[1]
[2]
[3]
[2]
[3]
[4]]
Есть ли какое-либо неправильное толкование с моей стороны? Пожалуйста, выясните, где я здесь ошибаюсь?
Комментарии:
1. Согласно документу , функция «Объединяет последовательность массивов вдоль существующей оси». Где говорится о преобразовании каждого входного массива из
(N,)
в(1,N)
или в(N,1)
?2. Ваши входные массивы не имеют одномерной формы
(N,)
, они уже(N,1)
есть. Ваш код просто подтверждает то, что говорится в документации.3. @fountainhead — цитируемый раздел взят из документации
np.vstack
, а неnp.concatenate
4. @fountainhead: я говорил о документации «vstack», а не о «конкатенации».
Ответ №1:
Вот код:
def vstack(tup):
arrs = np.atleast_2d(*tup)
if not isinstance(arrs, list):
arrs = [arrs]
return np.concatenate(arrs, 0)
Таким образом, он просто проверяет, что входные данные представляют собой список (по крайней мере) 2d-массивов, и выполняет объединение по первой оси.
Ваши массивы уже 2d, поэтому он просто делает
In [45]: a = np.array([[1], [2], [3]])
...: b = np.array([[2], [3], [4]])
In [46]: a
Out[46]:
array([[1],
[2],
[3]])
In [47]: b
Out[47]:
array([[2],
[3],
[4]])
In [48]: np.concatenate((a,b), axis=0)
Out[48]:
array([[1],
[2],
[3],
[2],
[3],
[4]])
Ваше «должно быть»
In [49]: np.concatenate((a[...,None],b[...,None]), axis=0)
Out[49]:
array([[[1]],
[[2]],
[[3]],
[[2]],
[[3]],
[[4]]])
In [50]: _.shape
Out[50]: (6, 1, 1)
Случай, когда добавление измерения имеет значение, изменение (3,) массивов на (1,3):
In [51]: np.vstack((a.ravel(),b.ravel()))
Out[51]:
array([[1, 2, 3],
[2, 3, 4]])
Комментарии:
1. Спасибо за разъяснение.. Итак, могу ли я предположить, что vstacking 1-D массивы — это особый случай, когда результирующий массив имеет на одно большее измерение больше, тогда как в случае 2 или более измерений результирующий массив сохраняет размеры?
2. Ключом является эта
atleast_2d
функция (см. Ее Документы и Код).np.stack
с другой стороны, всегда добавляется измерение. Снова посмотрите его документы и код.