在矩阵中找到不对称性

时间:2019-07-12 09:24:58

标签: python numpy matrix linear-algebra

我已经生成了列表项之间的成对距离矩阵,但是出了点问题,而且不对称。

如果矩阵看起来像这样:

array = np.array([
    [0, 3, 4],
    [3, 0, 2],
    [1, 2, 0]
])

如何找到实际的不对称性?在这种情况下,索引为4和1。

我已经尝试通过scipy平方函数压缩矩阵,然后使用

来确认不对称性。
def check_symmetric(a, rtol=1e-05, atol=1e-08):
    return np.allclose(a, a.T, rtol=rtol, atol=atol)

3 个答案:

答案 0 :(得分:1)

很晚了,但是这可能是一种麻木的方式...

import numpy as np

m = np.array([[0, 3, 4 ],
             [ 3, 0, 2 ],
             [ 1, 2, 0 ]])

def check_symmetric(a):

    diff = a - a.T

    boolmatrix = np.isclose(a, a.T) # play around with your tolerances here...

    output = np.argwhere(boolmatrix == False)

    return output 

输出:

check_symmetric(m)

>>> array([[0, 2],
           [2, 0]])

答案 1 :(得分:1)

您可以简单地使用np.isclose()的取反:

mask = ~np.isclose(array, array.T)
mask
# array([[False, False,  True],
#        [False, False, False],
#        [ True, False, False]])

使用该值作为索引来获取值:

array[mask]
# array([4, 1])

如果需要索引,请使用np.where()

np.where(mask)
# (array([0, 2]), array([2, 0]))

答案 2 :(得分:-2)

以下是快速而缓慢的操作,但是如果要调试的对象可能会这样做。

a  #  nearly symmetric array.
Out:
array([[8, 1, 6, 5, 3],
       [1, 9, 4, 4, 4],
       [6, 4, 3, 7, 1],
       [5, 4, 7, 5, 2],
       [3, 4, 1, 3, 7]])

定义查找和打印差异的功能。

ERROR_LIMIT = 0.00001
def find_asymmetries( a ):
    """ Prints the row and column indices with the difference 
        where abs(a[r,c] - a[c,r]) > ERROR_LIMIT """
    res = a-a.T
    for r, row in enumerate(res):
        for c, cell in enumerate(row):
            if abs(cell) > ERROR_LIMIT : print( r, c, cell )

find_asymmetries( a )
3 4 -1
4 3 1

此版本将结果量减半。

def find_asymmetries( a ):
    res = a-a.T
    for r, row in enumerate(res):
        for c, cell in enumerate(row):
            if c == r: break #   Stop column search once c == r
            if abs(cell) > ERROR_LIMIT : print( r, c, cell )

find_asymmetries( a )
4 3 1   # Row number always greater than column number