在 for 循环中更新变量 Python
Updating a variable in a for loop Python
我正在研究幂法的实现,以计算给定矩阵的主特征向量和特征值。我没有发布完整的代码,我有一个我无法理解的具体问题。
在下面的循环中,我通过将每个步骤的计算 x
分配给它来更新 x0
。这工作正常,但是,我需要计算每个步骤中 x
和 x0
之间的差异,并将它们保存在名为 epsilon
.
的变量中
由于 x0
赋值在 epsilon
计算后出现在行中,我希望它能工作,但在第一轮循环后我得到的 epsilon
是 0
,原因是 x0
和 x
在每个步骤中都是相同的。
我一直在考虑这个问题,但我希望能得到一些提示,指出我做错了什么。
for k in range(10):
y = matprod.matvec(m, x0)
normy = normvec.normvec(y)
for i in range(len(y)):
x[i] = y[i] / normy
epsilon[i] = x[i] - x0[i]
x0 = x
print k, x, x0, normy, epsilon
由于x
和x0
是数组,所以报错。 x0 = x
行不复制数据,而是使 x
和 x0
指向相同的数据。第一次完成后,他们将保持不变。
如果您想将数据从 x
复制到 x0
,您应该使用 x0 = x[:]
。 slice 语法 ([:]
) 创建数据的副本,因此应该可以工作。
这是 Python 中常见错误之一的结果。当我们有一个列表 b
并设置 a=b
时,我们并没有将 a
的每个值都设置为等于 b
的每个值。相反,我们将它们设置为 相同的东西 它们在内存中的位置相同。对其中一个的任何改变都会改变另一个。任何时候你有两个似乎总是相同的列表(或任何 python 对象),或者一个对象似乎在你意想不到的时候发生变化,你应该始终检查你是否已经这样做了。
x0 = x[:]
如果它是一个列表并且
将执行您想要的操作
x0 = x.copy()
如果它是麻木的。
假设这些是 numpy 数组,您还可以通过设置
来改进您的代码
x = y/normy
epsilon = x-x0
而不是循环执行。它会快得多,因为 numpy 已针对此进行了优化。
我正在研究幂法的实现,以计算给定矩阵的主特征向量和特征值。我没有发布完整的代码,我有一个我无法理解的具体问题。
在下面的循环中,我通过将每个步骤的计算 x
分配给它来更新 x0
。这工作正常,但是,我需要计算每个步骤中 x
和 x0
之间的差异,并将它们保存在名为 epsilon
.
由于 x0
赋值在 epsilon
计算后出现在行中,我希望它能工作,但在第一轮循环后我得到的 epsilon
是 0
,原因是 x0
和 x
在每个步骤中都是相同的。
我一直在考虑这个问题,但我希望能得到一些提示,指出我做错了什么。
for k in range(10):
y = matprod.matvec(m, x0)
normy = normvec.normvec(y)
for i in range(len(y)):
x[i] = y[i] / normy
epsilon[i] = x[i] - x0[i]
x0 = x
print k, x, x0, normy, epsilon
由于x
和x0
是数组,所以报错。 x0 = x
行不复制数据,而是使 x
和 x0
指向相同的数据。第一次完成后,他们将保持不变。
如果您想将数据从 x
复制到 x0
,您应该使用 x0 = x[:]
。 slice 语法 ([:]
) 创建数据的副本,因此应该可以工作。
这是 Python 中常见错误之一的结果。当我们有一个列表 b
并设置 a=b
时,我们并没有将 a
的每个值都设置为等于 b
的每个值。相反,我们将它们设置为 相同的东西 它们在内存中的位置相同。对其中一个的任何改变都会改变另一个。任何时候你有两个似乎总是相同的列表(或任何 python 对象),或者一个对象似乎在你意想不到的时候发生变化,你应该始终检查你是否已经这样做了。
x0 = x[:]
如果它是一个列表并且
将执行您想要的操作x0 = x.copy()
如果它是麻木的。
假设这些是 numpy 数组,您还可以通过设置
来改进您的代码x = y/normy
epsilon = x-x0
而不是循环执行。它会快得多,因为 numpy 已针对此进行了优化。