如何从 python 中的循环创建可变矩阵列表?
How to create a list of mutable matrices from a cycle in python?
我的目标是做一个动态模拟。为此,我创建了一个二维矩阵列表。每个矩阵应该一次更改一个条目("time" 瞬间是列表的每个步骤,它是可迭代的)。
我使用这种格式是因为我想在 Mathematica 中使用这个矩阵列表(我用 Python 创建),以使用 "Manipulate" 函数可视化动力学。
n=3
M=[[0,0,0][0,1,0][0,0,0]] # initial matrix M (a simple example)
l=[M]
numbersteps=10
for step in range(1,numbersteps+1):
for v1 in range(1,n**2+1):
for v2 in range(1,n**2+1):
i=VertexIndex (M,v1)[0] # i,j, ki, kj are indexes,
j=VertexIndex (M,v1)[1] # which I calculate in the function VertexIndex
ki=VertexIndex (M,v2)[0] # VertexIndex returns (int1,int2)
kj=VertexIndex (M,v2)[1]
if M[i-1][j-1]==1:
M[i-1][j-1]=-1
M[ki-1][kj-1]=1 # changes the entry M(ki, kj)
l.append(M) # list of each matrix M, for each step
我期待得到
l=[M(step1),M(step2),M(step3),...]`
因为 M 正在更改其条目,所以当我 运行 不同 M 的序列时,我会看到动态。
但是我得到的只是最终矩阵M的列表,"numbersteps"次,即
l=[M(finalstep),M(finalstep),M(finalstep),...], such that len(l)=numbersteps.
这有意义吗?我的错误在哪里?感谢您的帮助。
对象 M
在其初始化期间仅创建一次,因此每次使用 l.append(M)
将 M
附加到 l
时,您将附加对每次迭代都是同一个对象,因此随着对象的变化,对该对象的所有引用的值也会发生变化。
您可以附加列表列表的深层副本(先添加 from copy import deepcopy
):
l.append(deepcopy(M))
我的目标是做一个动态模拟。为此,我创建了一个二维矩阵列表。每个矩阵应该一次更改一个条目("time" 瞬间是列表的每个步骤,它是可迭代的)。
我使用这种格式是因为我想在 Mathematica 中使用这个矩阵列表(我用 Python 创建),以使用 "Manipulate" 函数可视化动力学。
n=3
M=[[0,0,0][0,1,0][0,0,0]] # initial matrix M (a simple example)
l=[M]
numbersteps=10
for step in range(1,numbersteps+1):
for v1 in range(1,n**2+1):
for v2 in range(1,n**2+1):
i=VertexIndex (M,v1)[0] # i,j, ki, kj are indexes,
j=VertexIndex (M,v1)[1] # which I calculate in the function VertexIndex
ki=VertexIndex (M,v2)[0] # VertexIndex returns (int1,int2)
kj=VertexIndex (M,v2)[1]
if M[i-1][j-1]==1:
M[i-1][j-1]=-1
M[ki-1][kj-1]=1 # changes the entry M(ki, kj)
l.append(M) # list of each matrix M, for each step
我期待得到
l=[M(step1),M(step2),M(step3),...]`
因为 M 正在更改其条目,所以当我 运行 不同 M 的序列时,我会看到动态。 但是我得到的只是最终矩阵M的列表,"numbersteps"次,即
l=[M(finalstep),M(finalstep),M(finalstep),...], such that len(l)=numbersteps.
这有意义吗?我的错误在哪里?感谢您的帮助。
对象 M
在其初始化期间仅创建一次,因此每次使用 l.append(M)
将 M
附加到 l
时,您将附加对每次迭代都是同一个对象,因此随着对象的变化,对该对象的所有引用的值也会发生变化。
您可以附加列表列表的深层副本(先添加 from copy import deepcopy
):
l.append(deepcopy(M))