在 Numpy 中检查矩阵是不是对称

Posted

技术标签:

【中文标题】在 Numpy 中检查矩阵是不是对称【英文标题】:Checking if a matrix is symmetric in Numpy在 Numpy 中检查矩阵是否对称 【发布时间】:2017-08-12 00:15:11 【问题描述】:

我正在尝试使用参数(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)

感谢任何帮助,谢谢!

【问题讨论】:

假设你的矩阵只是二维的,你不需要轴关键字。此外,您应该保持一个矩阵未转置,然后检查矩阵的转置。目前,您正在检查两个转置矩阵的相等性。 昨天关于对称矩阵测试的问题:***.com/questions/42876082/… 哦,谢谢你的链接......虽然我开始让它有点工作,即使我的测试不太正确:def check_symmetric(a, tol=1e-8): if np.transpose(a.any()) == np.array(a.any()): 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 【参考方案1】:

您可以使用 allclose 简单地将它与它的转置进行比较

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

【讨论】:

或者,检查 a-a.T 【参考方案2】:

下面的函数也解决了这个问题:

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

【讨论】:

当矩阵元素是自定义类型时,这个答案实际上也有效,与接受答案的“allclose”相反。例如四元数矩阵就是这种情况(参见github.com/moble/quaternion)【参考方案3】:

如果您不担心tot 阈值

(a==a.T).all()

是最简单的解决方案。这也适用于 N 维 (N>2) 数组。

【讨论】:

【参考方案4】:

这是一篇旧帖子,但我会推荐另一种方法。特别是对于稀疏矩阵,这可以快数百倍。

def is_symmetric(A, tol=1e-8):
    return scipy.sparse.linalg.norm(A-A.T, scipy.Inf) < tol;

或类似,但你明白了。使用范数是一种更加优化的计算。

【讨论】:

以上是关于在 Numpy 中检查矩阵是不是对称的主要内容,如果未能解决你的问题,请参考以下文章

在 Numpy 中生成对称矩阵

Numpy“智能”对称矩阵

线性代数之——正定矩阵

检查numpy数组是不是连续?

python实战应用讲解-numpy专题篇实用小技巧(附python示例代码)

如何检查 numpy 数组是不是为空?