Anexando a una matriz en un bucle – Python

Por favor, vea esta pregunta para la versión simplificada sin desorden

Estoy escribiendo una simulación de gravedad. La estructura de mi código es:

  • Una matriz de solution : contiene la solución (ya calculada) para el sistema de masas. Debido a la naturaleza de la resolución de ecuaciones diferenciales en Python, todos los valores relevantes (cada componente de posición y velocidad para cada masa en cada valor de tiempo) están en la matriz de la solution .

  • Una matriz de masses . Los objetos aquí contienen toda la información sobre cada masa, incluidos los arrays x_history que trato de actualizar a continuación.

  • No. de dimensiones d . Aquí he usado 2 por simplicidad.

    Tengo el siguiente código:

     d = 2 for i in range(len(masses)): # loop through masses for k in range(len(solution)): # loop through solution to obtain values at each timestep x = [] # d dimensional x vector at current timestep # fill the x-vector for j in range(d): x.append(solution[k][d * i + j]) masses[i].x_history.append(x) 

    La idea es simplemente recorrer los objetos en la matriz de masses , abstraer la información relevante de otra matriz (las matrices x representan vectores) y agregarla a las matrices de x_history en los objetos de masa. El problema es (he comprobado esto mediante la depuración) en las líneas:

     masses[i].x_history.append(x) 

    En lugar de agregarse a las masses[i].x_history para el valor actual de i , el código lo agrega a la matriz x_history para todos los objetos en la lista de masas, lo que significa que al final del bucle externo cada objeto en la lista de masas contiene Toda la información en lugar de solo la suya.

    ¿Alguien tiene alguna idea de por qué este podría ser el caso? ¿Estoy vectorizando accidentalmente esta operación o algo así?

    Parece que hiciste el bucle correcto pero agregando el valor a self.masses [i] .x_history en una posición con sangría incorrecta. Tiene que mover esas dos últimas declaraciones de línea una intención (cuatro espacios) hacia atrás.