Python 当仅引用一个数组时,将为两个不同的numpy数组分配相同的值
我正试图写一些代码来实现求解线性方程组的雅可比方法(我意识到我的方法不是最有效的方法,但我正试图找出它不起作用的原因) 我试图调试这个问题,并注意到以下问题。 代码在两次迭代后完成,因为在第32行的第二次迭代中,当xnew[i]被分配一个新值时,相同的值也被分配给x[i],即使x[i]没有被引用。为什么会在第二次迭代而不是第一次运行for循环时发生这种情况?有没有办法解决这个问题 提前谢谢Python 当仅引用一个数组时,将为两个不同的numpy数组分配相同的值,python,numpy,Python,Numpy,我正试图写一些代码来实现求解线性方程组的雅可比方法(我意识到我的方法不是最有效的方法,但我正试图找出它不起作用的原因) 我试图调试这个问题,并注意到以下问题。 代码在两次迭代后完成,因为在第32行的第二次迭代中,当xnew[i]被分配一个新值时,相同的值也被分配给x[i],即使x[i]没有被引用。为什么会在第二次迭代而不是第一次运行for循环时发生这种情况?有没有办法解决这个问题 提前谢谢 import numpy as np A = np.array( [[0.93, 0.24, 0
import numpy as np
A = np.array(
[[0.93, 0.24, 0],
[0.04, 0.54, 0.26],
[1, 1, 1]])
b = np.array([[6.0], [2.0], [10.0]])
n , m = np.shape(A)
x = np.zeros(shape=(n,1))
xnew = np.zeros(shape=(n,1))
iterlimit = 100
tol = 0.0000001
for iteration in range(iterlimit):
convergence = True
for i in range(n):
sum=0
for j in range(n):
if j != i:
sum = sum + (A[i,j] * x[j])
#on second iteration (iteration =1) below line begins to
#assign x[i] the same values as it assigns xnew[i] causing the
#convergence check below to not run and results in a premature break
xnew[i] = 1/A[i,i] * (b[i] - sum)
if abs(xnew[i]-x[i]) > tol:
convergence = False
if convergence:
break
x = xnew
print("Iteration:", iteration+1)
print("Solution:")
print(np.matrix(xnew))
此行将xnew
分配给x
。不是xnew的内容,而是数组本身。因此,在第一次迭代之后,x
和xnew
引用内存中的相同数组
请改为尝试x[:]=xnew[:]
此行将xnew
分配给x
。不是xnew的内容,而是数组本身。因此,在第一次迭代之后,x
和xnew
引用内存中的相同数组
请改为尝试
x[:]=xnew[:]
问题就在这里:x=xnew
事实上,通过这种方式,您现在正在引用同一个对象。显然,当您更改xnew时,您正在更改xnew表示的对象,该对象现在也被x引用
因此,要制作副本,您可以写:
x=xnew[:]
或
x=xnew.copy()
问题就在这里:x=xnew
事实上,通过这种方式,您现在正在引用同一个对象。显然,当您更改xnew时,您正在更改xnew表示的对象,该对象现在也被x引用
因此,要制作副本,您可以写:
x=xnew[:]
或
x=xnew.copy()
x=xnew
不复制阵列。两个变量引用同一个数组。x=xnew
将同一数组的引用分配给两个变量。这是否回答了您的问题?谢谢大家!将xnew中的值复制到x的最佳方法是numpy.copyto(x,xnew)吗?我建议x=xnew.copy()
x=xnew
不复制数组。两个变量引用同一个数组。x=xnew
将同一数组的引用分配给两个变量。这是否回答了您的问题?谢谢大家!将xnew中的值复制到x的最佳方法是numpy.copyto(x,xnew)吗?我建议x=xnew.copy()
谢谢!x=xnew将两个变量分配给内存中的同一事物的规则是否只适用于python中的对象?因为它不适用于简单变量,对吗?例如,如果x和xnew是整数而不是数组,这就可以了。@user157691这通常适用于所有Python变量。如果x
和xnew
是整数,则赋值x=xnew
将导致两个变量都指向内存中的同一个整数(您可以在赋值前后查看id(x)
和id(xnew)
,或者检查x是xnew
是否为真)。如果对该整数运行一个函数,该函数以某种方式改变了其值(但没有使用python赋值运算符=
,因为这会在内存中创建一个新的整数),那么这两个变量似乎仍然指向同一个值。谢谢!x=xnew将两个变量分配给内存中的同一事物的规则是否只适用于python中的对象?因为它不适用于简单变量,对吗?例如,如果x和xnew是整数而不是数组,这就可以了。@user157691这通常适用于所有Python变量。如果x
和xnew
是整数,则赋值x=xnew
将导致两个变量都指向内存中的同一个整数(您可以在赋值前后查看id(x)
和id(xnew)
,或者检查x是xnew
是否为真)。如果随后对该整数运行一个函数,该函数以某种方式改变了其值(但没有使用python赋值运算符=
,因为这会在内存中创建一个新的整数),那么这两个变量似乎仍然指向同一个值。
x = xnew