Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当仅引用一个数组时,将为两个不同的numpy数组分配相同的值_Python_Numpy - Fatal编程技术网

Python 当仅引用一个数组时,将为两个不同的numpy数组分配相同的值

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

我正试图写一些代码来实现求解线性方程组的雅可比方法(我意识到我的方法不是最有效的方法,但我正试图找出它不起作用的原因)

我试图调试这个问题,并注意到以下问题。 代码在两次迭代后完成,因为在第32行的第二次迭代中,当xnew[i]被分配一个新值时,相同的值也被分配给x[i],即使x[i]没有被引用。为什么会在第二次迭代而不是第一次运行for循环时发生这种情况?有没有办法解决这个问题

提前谢谢

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