Присоединение к массиву - это, в первую очередь, дорогая и вонючая операция. Дело в том, что содержимое массива может быть изменяемым, а адрес базового буфера - нет. Каждый раз, когда вы добавляете элемент, все это перераспределяется и копируется. Насколько я знаю, нет даже попытки амортизации, как с list
.
Если вы придерживаетесь немного другого подхода, я бы порекомендовал сохранить ваши данные в list
, как у вас сейчас. Вы просто преобразуете свой список в массив, когда вам действительно нужен массив. Помните, что это дешевле, чем каждый раз перераспределять новый массив, и вам, вероятно, не придется делать это часто по сравнению с количеством добавлений:
stack = [[1], [4, 5]]
a = np.array(stack, dtype=np.object)
# do stuff to the array
...
stack.append([2, 3, 4])
a = np.array(stack, dtype=np.object)
Обновление Теперь, когда я понял ваш вопрос
Если ваша цель состоит в том, чтобы просто выяснить, как добавить элемент в массив объектов, не имея при этом факта, что это список, вам нужно сначала создать массив или элемент, который будет пустым. Вместо того, чтобы пытаться принудить тип с помощью поддельных элементов, как предлагают некоторые комментарии, я рекомендую просто создать пустые элементы и явно указать их в своем списке. Вы можете заключить операцию в функцию, если хотите иметь чистый интерфейс.
Вот пример:
b = [2, 3, 4]
c = np.empty(1, dtype=np.object)
c[0] = b
a = np.concatenate((a, c))
OR
a = np.append(a, c)
Конечно, это не так чисто, как np.array([b], dtype=np.object)
, но это всего лишь артефакт того, как массивные процессы обрабатывают массивы. Причина, по которой вам в значительной степени приходится делать это так, заключается в том, что numpy рассматривает все, что является списком или кортежем, как специальный элемент, который вы хотите преобразовать в массив на внешнем уровне.