web-dev-qa-db-ja.com

Numpyで行列が対称かどうかを確認する

私は、行列が対称であるかどうかをユーザーに伝えるブール値を返す引数(a,tol=1e-8)を使用して関数を作成しようとしています(対称行列は転置に等しい)。これまでのところ:

def check_symmetric(a, tol=1e-8):
if np.transpose(a, axes=axes) == np.transpose(a, axes=axes):
    return True
def sqr(s):
    rows = len(s)
    for row in sq:
        if len(row) != rows:
            return False
    return True
if a != sqr(s):
    raise ValueError

私はaxes isn't definedメッセージを取得し続けていますが、それはまったく機能しないと確信しています...私が合格したいテストは次のとおりです:

e = np.eye(4)
f = np.diag([1], k=3)
g = e[1:, :]

print(check_symmetric(e))
print(not check_symmetric(e + f))
print(check_symmetric(e + f * 1e-9))
print(not check_symmetric(e + f * 1e-9, 1e-10))
try:
    check_symmetric(g)
    print(False)
except ValueError:
    print(True)

どんな助けもありがたいです、ありがとう!

15
plshalp

allcloseを使用して単純に転置と比較できます

def check_symmetric(a, rtol=1e-05, atol=1e-08):
    return numpy.allclose(a, a.T, rtol=rtol, atol=atol)
40
Nils Werner

次の関数も問題を解決します。

def check_symmetric(a, tol=1e-8):
    return np.all(np.abs(a-a.T) < tol)
0