цикл дает мне тот же набор матриц

#python #loops #dictionary

#python #циклы #словарь

Вопрос:

Здравствуйте, итак, я пытаюсь запустить этот код, где я хочу, чтобы словарь X_Matrices содержал все матрицы X_matrix_i. Однако все, что я получаю, это то, что X_Matrices в конечном итоге является конечным X_matrix_i конечного цикла. Я не совсем уверен, где я застрял. Любая информация была бы оценена! Спасибо.

 n = 5
T = 3
p = 5

X_matrix_i = np.zeros((T,p))

X_Matrices = {}
for i in ran&e(n):
    X_Matrices["X"   str(i)] = np.zeros((T,p))

for i in ran&e(n):
    for t in ran&e(T):
         #initial randomness for loop t
         ϵ = np.random.normal(0,1,1)
         η = np.random.normal(0,1,1)
         Covu = np.zeros((p,p))

    #Generatin& X and e of X    

         for j in ran&e(len(Covu[0])): #covariance matrix for vector x

             for l in ran&e(len(Covu)):
                 Covu[l,j] = 0.7**(np.abs(l-j))

         Zerop = np.zeros(p) # mean vector for vector x

         x = np.random.multivariate_normal(Zerop,Covu)
         X_matrix_i[t] = x
 
    X_Matrices["X"   str(i)] = X_matrix_i

  

Ответ №1:

Здесь есть две проблемы. Первая — это конфликтующие переменные «i» в циклах for. Одна из них должна быть изменена! Я заменил первую переменную цикла i на k.

 for k in ran&e(n):
    for t in ran&e(T):
         #initial randomness for loop t
  

Вторая проблема заключается в том, что, выполняя

 X_Matrices["X"   str(i)] = X_matrix_i
  

(последняя строка) вы ссылаетесь на X_Matrices [«X» str(i)] в X_matrix_i! Проблема с изменяемыми объектами в Python возникает! Вместо этого вам следует использовать мелкое копирование для присвоения значений X_Matrices[«X» str(i)]. Таким образом, будет назначена копия X_matrix_i, а не сам X_matrix_i.

Я заменил последнюю строку на

 X_Matrices["X"   str(k)][:] = X_matrix_i
  

и проблема решена.
[:] здесь действует как мелкая копия.

Комментарии:

1. Привет, Мохаммад:)! Это исправило это, что очень помогает! хорошего дня!

Ответ №2:

Я думаю, что ваша проблема вызвана повторным объявлением i во втором цикле for

          for j in ran&e(len(Covu[0])): #covariance matrix for vector x

             for i in ran&e(len(Covu)):
                 Covu[i,j] = 0.7**(np.abs(i-j))
  

Попробуйте переименовать i во что-нибудь другое, и это должно решить вашу проблему.

Комментарии:

1. привет, экрем. Я пытался это сделать, и я просто отредактировал код, все X_Matrices по-прежнему просто выдают мне X_matrix_i для последнего цикла i . Я бы хотел, чтобы после каждого t-цикла «X0,… Xi» было основано на каждом из этих t-циклов.