Вы начинаете с массива (0,) и (n,) в форме:
In [482]: arr1 = np.array([])
In [483]: arr1.shape
Out[483]: (0,)
In [484]: arr2 = np.array([1,2,3])
In [485]: arr2.shape
Out[485]: (3,)
np.append
использует concatenate
(но с некоторыми забавными делами, когда ось не указана):
In [486]: np.append(arr1, arr2)
Out[486]: array([1., 2., 3.])
In [487]: np.append(arr1, arr2,axis=0)
Out[487]: array([1., 2., 3.])
In [489]: np.concatenate([arr1, arr2])
Out[489]: array([1., 2., 3.])
И пробная ось = 1
In [488]: np.append(arr1, arr2,axis=1)
---------------------------------------------------------------------------
AxisError Traceback (most recent call last)
<ipython-input-488-457b8657453e> in <module>()
----> 1 np.append(arr1, arr2,axis=1)
/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py in append(arr, values, axis)
4526 values = ravel(values)
4527 axis = arr.ndim-1
-> 4528 return concatenate((arr, values), axis=axis)
AxisError: axis 1 is out of bounds for array of dimension 1
Просмотрите все сообщение - ошибка возникает на шаге concatenate
. Вы не можете объединить 1d массивы вдоль axis=1
.
Использование np.append
или даже np.concatenate
итеративно медленно (каждый раз он создает новый массив), и его трудно правильно инициализировать. Это плохая замена для широко используемого списка append-to-empty-list
рецепт.
np.c_
- это просто функция обложки для concatenate
.
Не существует только одного empty
массива. np.array([[]])
и np.array([[[]]])
также имеют 0 элементов.
Если вы хотите добавить столбец в массив, вам нужно начать с 2d массива, а столбец также должен быть 2d.
Вот пример правильной конкатенации 2-мерных массивов:
In [490]: np.concatenate([ np.zeros((3,0),int), np.arange(3)[:,None]], axis=1)
Out[490]:
array([[0],
[1],
[2]])
column_stack
- это еще одна функция обложки для concatenate
, которая обеспечивает входы 2d. Но даже с этим получить начальный «пустой» массив сложно.
In [492]: np.column_stack([np.zeros(3,int), np.arange(3)])
Out[492]:
array([[0, 0],
[0, 1],
[0, 2]])
In [493]: np.column_stack([np.zeros((3,0),int), np.arange(3)])
Out[493]:
array([[0],
[1],
[2]])
np.c_
очень похоже на column_stack
, но реализовано по-другому:
In [496]: np.c_[np.zeros(3,int), np.arange(3)]
Out[496]:
array([[0, 0],
[0, 1],
[0, 2]])
Основное сообщение заключается в том, что при использовании np.concatenate
необходимо обращать внимание на размеры. Его варианты позволяют вам немного выдумывать, но вам действительно нужно понимать, что обманчивость помогает сделать все правильно, особенно когда вы начинаете с этой плохо определенной идеи «пустого» массива.