NumPy错误:具有多个元素的数组的真实值不明确。使用a.any()或a.all()。

5

我正在使用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()

在线上,当i < imaxdelta_new > epsilon**2 * delta_0 时,执行以下操作:

请问我做错了什么?


1
欢迎来到Stackoverflow!为了充分利用该网站,重要的是要提出好问题,这包括创建一个最小、完整和可验证的示例。 - Stephen Rauch
4个回答

14

看起来 delta_newdelta_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

3

实际上,您有一个矩阵 delta_new,它与另一个矩阵 epsilon**2 * delta_0 进行比较,产生多个真值。

由于存在多个真值,因此没有明确的是或否。

因此,该条件可以使用 .all(对于每个元素)或 .any(对于每个元素)来解决这种多样性。


1

delta_new是一个矩阵。线性算术比较操作对于矩阵没有定义。您尝试使用简单标量比较将一个值矩阵与另一个值矩阵进行比较。Python不知道如何从中给出单个T/F结果。

我怀疑您想要在矩阵上获取一些标量属性,例如行列式。


啊..这很有道理。我真是个白痴!!谢谢 :) - SiltyDoubloon

0

这也发生在稀疏矩阵中,例如:`scipy.sparse.csr.csr_matrix`

解决方法是添加todense()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接