【问题标题】:Numpy arrays getting "ValueError: setting an array element with a sequence" in a for loop? [closed]Numpy数组在for循环中获得“ValueError:设置带有序列的数组元素”? [关闭]
【发布时间】:2021-01-30 12:22:54
【问题描述】:

我得到了他的错误,无法找出原因。显然这段代码在 Python 2 中工作,我使用的是 Python 3.7,这似乎是问题所在?有人能够解释这里出了什么问题吗?

A = np.array([[10,12],[12,10]])
b= np.array([2,1])
x0 = np.array([0., 0.])
tol =  10 ** (-15)
max_iter = 20
w = 1.5


def SOR(A, b, x0, tol, max_iter, w): 
    if (w<=1 or w>2): 
        print('w should be inside [1, 2)'); 
        step = -1; 
        x = float('nan') 
        return 
    n = b.shape 
    x = x0 

    for step in range (1, max_iter): 
        for i in range(n[0]): 
            new_values_sum = np.dot(A[i, :i], x[:i])
            old_values_sum = np.dot(A[i, i+1 :], x0[ i+1: ]) 
            x[i] = (b[i] - (old_values_sum + new_values_sum)) / A[i, i] 
            x[i] = np.dot(x[i], w) + np.dot(x0[i], (1 - w))  
        if (np.linalg.norm(x - x0) < tol): 
        if (np.linalg.norm(np.dot(A, x)-b ) < tol):
            print(step) 
            break 
        x0 = x

    print("X = {}".format(x)) 
    print("The number of iterations is: {}".format(step))
    return x
x = SOR(A, b, x0, tol, max_iter, w)
print(np.dot(A, x))

我得到以下错误信息:

Error:  x[i]=(1-w)*x[i]-w*(np.dot(A[i,:],x)-b[i]-A[i,i]*x[i])/A[i,i]  
   ValueError: setting an array element with a sequence. 

尝试用上面的代码实现 SOR 方法,为什么会出现这个错误?

【问题讨论】:

  • 请提供预期的MRE。显示中间结果与预期结果的偏差;包括您的初始调试跟踪:错误点的违规值是什么,它们与您的需要有何不同。我们应该能够将您的代码块粘贴到文件中,运行它并重现您的问题。
  • x/x0 是一个 (2,) 形状数组; x[i] 是一个号码的插槽。显然,在您的错误行中,分配的 RHS 正在生成一个具有多个值的数组。您需要自行评估它并检查值和shape,然后找出为什么它不是您所期望的。这只是一个基本的调试步骤 - 检查问题行中的值。

标签: python arrays python-3.x numpy loops


【解决方案1】:

很可能,您有多个名称相似的文件,或者您位于错误的文件夹中。您似乎运行了错误的代码。

以下行未出现在您共享的代码中,您可能想检查一下您的Abx 是什么:

x[i]=(1-w)*x[i]-w*(np.dot(A[i,:],x)-b[i]-A[i,i]*x[i])/A[i,i]

您应该能够在我更改了您的终止条件的地方运行以下代码,因为目前第一个 if 语句尚未完成:

import numpy as np 
import math 

A = np.array([[10,12],[12,10]])
b= np.array([2,1])
x0 = np.array([0., 0.])
tol =  10 ** (-15)
max_iter = 20
w = 1.5


def SOR(A, b, x0, tol, max_iter, w): 
    if (w<=1 or w>2): 
        print('w should be inside [1, 2)'); 
        step = -1; 
        x = float('nan') 
        return 
    n = b.shape 
    x = x0 

    for step in range (1, max_iter): 
        for i in range(n[0]): 
            new_values_sum = np.dot(A[i, :i], x[:i])
            old_values_sum = np.dot(A[i, i+1 :], x0[ i+1: ]) 
            x[i] = (b[i] - (old_values_sum + new_values_sum)) / A[i, i] 
            x[i] = np.dot(x[i], w) + np.dot(x0[i], (1 - w))  
        if (np.linalg.norm(x - x0) < tol) and (np.linalg.norm(np.dot(A, x)-b ) < tol):
            print(step) 
            break 
        x0 = x

    print("X = {}".format(x)) 
    print("The number of iterations is: {}".format(step))
    return x
x = SOR(A, b, x0, tol, max_iter, w)
print(np.dot(A, x))

我获得了 Python 2 和 Python 3 的以下输出:

X = [ 270.45162499 -324.44194999]
The number of iterations is: 19
[-1.18878715e+03  1.00000000e+00]

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 2015-12-19
    • 2013-03-12
    • 2017-10-20
    • 1970-01-01
    • 2019-01-03
    • 2016-01-21
    • 2018-11-07
    • 2018-05-09
    相关资源
    最近更新 更多