Ошибка NumPy: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all () - PullRequest
0 голосов
/ 15 января 2019

Я работаю над кодом Image Convolution, используя 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:

Может ли кто-нибудь сказать мне, что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Фактически у вас есть матрица delta_new, которая сравнивается с другой матрицей epsilon**2 * delta_0, которая выдает несколько значений истинности.

При множественных значениях истинности нет однозначного да или нет.

Таким образом, это условие может использовать .all (и для каждого элемента) или .any (или для каждого элемента) для разрешения этой кратности.

0 голосов
/ 15 января 2019

Похоже, 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()

Вы должны в основном "выбрать", как свернуть сравнения всех значений по всем вашим массивам до одного типа bool.

>>> (a<b).any()
True

>>> (a<b).all()
False
0 голосов
/ 15 января 2019

delta_new - это матрица. Линейные арифметические операции сравнения не определены для матриц. Вы пытались сравнить матрицу значений с другой матрицей значений с помощью простого скалярного сравнения. Python не знает, как дать вам один T / F результат из этого.

Я подозреваю, что вам нужно некоторое скалярное свойство в матрицах, такое как определитель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...