我正在使用numpy处理图像卷积代码:
def CG(A, b, x, imax=10, epsilon = 0.01):
steps=np.asarray(x)
i = 0
r = b - A * x
d = r.copy()
delta_new = r.T * r
delta_0 = delta_new
while i < imax and delta_new > epsilon**2 * delta_0:
q = A * d
alpha = float(delta_new / (d.T * q))
x = x + alpha * d
if i%50 == 0:
r = b - A * x
else:
r = r - alpha * q
delta_old = delta_new
delta_new = r.T * r
beta = float(delta_new / delta_old)
d = r + beta * d
i = i + 1
steps = np.append(steps, np.asarray(x), axis=1)
return steps
我收到以下错误:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
第while i < imax and delta_new > epsilon**2 * delta_0:
行
有人可以告诉我我做错了什么吗?
答案 0 :(得分:1)
delta_new
是一个矩阵。没有为矩阵定义线性算术比较运算。您试图通过简单的标量比较将值矩阵与另一个值矩阵进行比较。 Python不知道如何从中给您一个T / F结果。
我怀疑您希望矩阵具有标量属性,例如行列式。
答案 1 :(得分:1)
实际上,您有一个矩阵delta_new
与另一个产生多个真值的矩阵epsilon**2 * delta_0
进行比较。
具有多个真值,没有确定的是或否。
因此该条件可以使用.all
(针对每个元素)或.any
(针对每个元素)来解决这种多重性。
答案 2 :(得分:1)
看起来delta_new
和delta_0
是Numpy数组,而Numpy不知道如何比较它们。
作为一个例子,假设您是否采用了两个随机的Numpy数组并尝试进行比较:
>>> a = np.array([1, 3, 5])
>>> b = np.array([5, 3, 1])
>>> print(a<b)
array([True, False, False])
>>> bool(a<b)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
您必须基本上“选择”如何将所有数组中所有值的比较折叠成一个布尔值。
>>> (a<b).any()
True
>>> (a<b).all()
False