Estou usando o trinket.io, um IDE online para python3. Atualmente, não tenho acesso a nenhum outro IDE para download. Estou tentando criar um array numpy usando inúmeras instruções iterativas e condicionais. Quando imprimo cada lista, recebo os resultados corretos que espero, mas quando os acrescento ao array, os resultados são muito estranhos.
Este é meu código:
import numpy as np
import matplotlib.pyplot as plt
from sympy import *
x = Symbol('x')
y = Function('f')(x)
#Equation is ay_(n-1) + by_n + cy_(n+1) = d
a = 3
b = 4
c = 6
d = 4
#Final row equation: ey_(n-2)+fy_(n-1)+gy_(n) = d
e = 5
f = 3
g = 7
#Timestep
h = 0.2
#Initialize variables
y_0 = 0
final_point = 1
array = []
row = []
i = 1
array_row_size = int(final_point / h)
array_column_size = array_row_size + 1
for i in range(1,array_row_size+1):
row.clear()
if i == 1:
row.append(b)
row.append(c)
for j in range(2, array_column_size-1):
row.append(0)
row.append(d)
elif i == 2:
row.append(a)
row.append(b)
row.append(c)
for j in range(3, array_column_size-1):
row.append(0)
row.append(d)
elif i < (array_column_size - 1) and i>2:
for j in range(2,i):
row.append(0)
row.append(a)
row.append(b)
row.append(c)
for j in range(i+1, array_column_size-1):
row.append(0)
row.append(d)
else:
for j in range(1, array_column_size-3):
row.append(0)
row.append(e)
row.append(f)
row.append(g)
row.append(d)
array.append(row)
print("Row:", row)
print("Array", array)
i += 1
#print(array)
e estes são os resultados:
Row: [4, 6, 0, 0, 0, 4]
Array [[4, 6, 0, 0, 0, 4]]
Row: [3, 4, 6, 0, 0, 4]
Array [[3, 4, 6, 0, 0, 4], [3, 4, 6, 0, 0, 4]]
Row: [0, 3, 4, 6, 0, 4]
Array [[0, 3, 4, 6, 0, 4], [0, 3, 4, 6, 0, 4], [0, 3, 4, 6, 0, 4]]
Row: [0, 0, 3, 4, 6, 4]
Array [[0, 0, 3, 4, 6, 4], [0, 0, 3, 4, 6, 4], [0, 0, 3, 4, 6, 4], [0, 0, 3, 4, 6, 4]]
Row: [0, 0, 5, 3, 7, 4]
Array [[0, 0, 5, 3, 7, 4], [0, 0, 5, 3, 7, 4], [0, 0, 5, 3, 7, 4], [0, 0, 5, 3, 7, 4], [0, 0, 5, 3, 7, 4]]
Isso é obviamente muito diferente do esperado, pois eu esperaria que cada linha fosse diferente na matriz, enquanto que em cada iteração todas as linhas são atualizadas e são as mesmas.
Ao anexar a
row
lista ao array, você não está criando uma cópia da listarow
naquele momento, mas sim adicionando uma referência à mesmarow
lista. Toda vez que você modificarow
no loop, está modificando a mesma lista subjacente para a qual todos os elementos do seu arrayarray
apontam.Você precisa criar uma nova
row
lista em cada iteração e, em seguida, anexar uma cópia dela aoarray
, cada elemento noarray
será uma lista distinta contendo os valores calculados naquela iteração específica.Saída