как работает vstack в соответствии с документацией numpy

#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 с другой стороны, всегда добавляется измерение. Снова посмотрите его документы и код.