我已经生成了列表项之间的成对距离矩阵,但是出了点问题,而且不对称。
如果矩阵看起来像这样:
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)
答案 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