Питонически добавляя столбец в бесконечно пустую матрицу в цикле

#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)