Python解决ValueError

Posted

技术标签:

【中文标题】Python解决ValueError【英文标题】:Python spsolve ValueError 【发布时间】:2018-07-22 11:31:18 【问题描述】:

我正在尝试使用 spsolve 以规范形式求解系统。 不幸的是,我收到一条我不明白的错误消息。

我的代码

A11 = nablaTnabla + lamda*diag_Ix_squared
A12 = lamda*diag_Ix_Iy
A21 = lamda*diag_Ix_Iy
A22 = nablaTnabla + lamda*diag_Iy_squared 

b0 = lamda*(Ix*(Ix*u_0 + Iy*v_0 - It))
b1 = lamda*(Iy*(Ix*u_0 + Iy*v_0 - It))
A = np.matrix([[A11,A12],[A21,A22]])
b0 = b0.flatten()
b1 = b1.flatten()
b = np.array([b0,b1])
u,v = sp.linalg.spsolve(A,b)

我收到以下关于 spsolve 的错误消息: ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()。

A 的形状为:(2,2) b 的形状为:(2, 226592)

我不知道如何解决这个错误。有谁能帮帮我吗?

【问题讨论】:

【参考方案1】:

我发现了问题。我将稀疏矩阵与密集矩阵混淆了,因此 spsolve 无法计算系统。 变量 diag_Ix_squared 是一个稀疏矩阵,所以其余的也必须是一个。

  M = u.shape[0]
  N = u.shape[1]
  nabla = spnabla(M,N)
  nablaTnabla = nabla.T*nabla
  u_0 = u
  v_0 = v
  Ix_flat = Ix.flatten()
  Iy_flat = Iy.flatten()
  diag_Ix_squared = sp.spdiags(Ix_flat*Ix_flat, 0, M*N, M*N)
  diag_Ix_Iy = sp.spdiags(Ix_flat*Iy_flat, 0, M*N, M*N)
  diag_Iy_squared = sp.spdiags(Iy_flat*Iy_flat, 0, M*N, M*N)

  A11 = nablaTnabla + lamda*diag_Ix_squared
  A12 = lamda*diag_Ix_Iy
  A21 = lamda*diag_Ix_Iy
  A22 = nablaTnabla + lamda*diag_Iy_squared

  b0 = lamda*(Ix*(Ix*u_0 + Iy*v_0 - It))
  b0 = b0.ravel()
  b1 = lamda*(Iy*(Ix*u_0 + Iy*v_0 - It))
  b1 = b1.ravel()


  A = sp.bmat([[A11,A12],[A21,A22]])

  b =  np.concatenate((b0,b1))

  x = sp.linalg.spsolve(A,b)
  u = x[:M*N]
  v = x[M*N:]
  u = np.reshape(u, (M,N))
  v = np.reshape(v, (M,N))

【讨论】:

以上是关于Python解决ValueError的主要内容,如果未能解决你的问题,请参考以下文章

如何在解决python中的条件时解决python中的位置索引错误?

解决问题解决python安装模块时UnicodeDecodeError

python问题解决

python高并发怎么解决

如何解决Python中文问题

Python 问题怎么解决?