Здравствуйте, у меня есть следующий код, который переносит одну матрицу и сравнивает ее с исходной матрицей, чтобы проверить, является ли матрица симметричной.

def sym(x):
    
    mat = x
    transpose = 0;
    
    (m,n) = x.shape
    if(m != n):
        print("Matrix must be square")
        return
    else:
        transpose = ([[x[j][i] for j in range(len(x))] for i in range(len(x[0]))])
        print(transpose)
        print(x)
        if(transpose == mat):
           print("Symetrical")
        else:
           print("Not symetrical")
            
        return
    
    A = np.random.rand(5,5)
    SymMatrix = (A + A.T)/2
    sym(SymMatrix)

По отпечаткам я получаю следующие данные:

[[0.17439677739055337, 0.4578837676040824, 0.35842887026076997, 0.8610456087667133,      0.2967753611380975], [0.4578837676040824, 0.6694101430064164, 0.6718596412137644, 0.5107862111816033, 0.6429698779871544], [0.35842887026076997, 0.6718596412137644, 0.5387701626024015, 0.708555677626843, 0.5756758392540096], [0.8610456087667133, 0.5107862111816033, 0.708555677626843, 0.37095928395815847, 0.7062962356554356], [0.2967753611380975, 0.6429698779871544, 0.5756758392540096, 0.7062962356554356, 0.3807024190850993]]

    [[0.17439678 0.45788377 0.35842887 0.86104561 0.29677536]
     [0.45788377 0.66941014 0.67185964 0.51078621 0.64296988]
     [0.35842887 0.67185964 0.53877016 0.70855568 0.57567584]
     [0.86104561 0.51078621 0.70855568 0.37095928 0.70629624]
     [0.29677536 0.64296988 0.57567584 0.70629624 0.38070242]]

Вместе с этой ошибкой:

  The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Первая проблема, которую я вижу, заключается в том, что матрица транспонирования имеет дополнительные десятичные дроби в каждом значении, которое я не понимаю, и я не уверен, является ли это причиной ошибки. Любая помощь по этому поводу будет оценена. Спасибо!

-1
Jack 23 Ноя 2021 в 16:21

1 ответ

Лучший ответ

Вы пытаетесь сравнить два ndarrays, что приводит примерно к следующему:

transpose == mat
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]])

Оператор if не знает, какое логическое значение ему следует выбрать. Должно ли быть True, если любое значение равно True, или только если все значения равны True?

Чтобы указать, что все значения должны быть True, добавьте: .all() в свой оператор:

if((transpose == mat).all())

В результате получается одно логическое значение (в данном случае: True).

0
Paul 23 Ноя 2021 в 17:24