#python #numpy
Вопрос:
Я новичок в python и изо всех сил пытаюсь это сделать, несмотря на то, что это кажется действительно простым делом.
вот моя попытка
max_depth_vars = np.linspace(5, 1, 12)
n_mdvs = len(max_depth_vars)
predictions = np.array
for index, max_depth_var in zip(range(0,n_mdvs),max_depth_vars):
# Instantiate model
rf = RandomForestRegressor(max_depth=max_depth_var)
# Train the model on training data
rf.fit(X_train, Y_train)
predictions= np.column_stack((np.array(predictions), np.array(rf.predict(X_train))))
массив predictions
начинается как пустой вне цикла, затем в него добавляются столбцы в цикле — или, по крайней мере, это то, что я хотел. Что я получаю, так это:
Ошибка значения: все размеры входного массива для оси объединения должны точно совпадать, но вдоль измерения 0 массив с индексом 0 имеет размер 1, а массив с индексом 1 имеет размер 361
на последней строчке
Как вы питонически добавляете столбцы в изначально пустую матрицу в цикле?
Комментарии:
1. вы можете использовать список, добавлять в список во время цикла и преобразовывать список в np.массив после завершения цикла
2.
np.array
это функция, а не «пустой массив». Не стоит наивно имитировать методы списка в numpy. Для итераций, подобных этой, лучше собрать результаты в список и создать массив с одним вызовом в конце. Вы получили ошибку при этой попытке? Попробуй это понять?3. просто добавил предупреждение
4. Обратная трассировка ошибок показывает, что ошибка произошла в
np.concatenate
.np.array(np.array)
представляет собой массив dtype объекта 0d.np.append
изменяет его на 1d, но он по-прежнему содержит только 1 элемент, форму (1,). Повторяетсяnp.append
медленнее (чем добавление списка), и его трудно правильно использовать. Я вижу слишком много ошибок, когда плакаты пытаются его использовать.
Ответ №1:
Для добавления в комментарии np.array
оптимизирован для фиксированного размера. Последовательное изменение размера массива concatenate
с использованием vstack
, hstack
, и т.д. В for
цикле менее читаемо и, как правило, менее эффективно (поэтому бессмысленно). Придерживайтесь стандартного и простого .append
a list
, затем сделайте массив в конце:
predictions = list()
for index, max_depth_var in zip(range(0,n_mdvs),max_depth_vars):
#your_code
predictions.append(your_iteration_array)
predictions = np.array(predictions)