NumPy:查找二维数组中的对称值

3

我需要分析一个二次2D numpy数组LL,找出对称(LL[i,j] == LL[j,i])且非零值的数值。

有没有更快、更像数组的方法来完成这个任务,而不需要使用循环?有没有一种简单的方法可以存储这些值的索引,以便于后续使用,而不需要在每个循环中创建数组并添加索引元组?

下面是我的经典循环方法来存储这些值的索引:

IdxArray = np.array() # Array to store the indices
for i in range(len(LL)):
    for j in range(i+1,len(LL)):
        if LL[i,j] != 0.0:
            if LL[i,j] == LL[j,i]:
                IdxArray = np.vstack((IdxArray,[i,j]))                    

稍后使用索引:
for idx in IdxArray:
    P = LL[idx]*(TT[idx[0]]-TT[idx[1]])
    ...
2个回答

3
>>> a = numpy.matrix('5 2; 5 4')
>>> b = numpy.matrix('1 2; 3 4')
>>> a.T == b.T
matrix([[False, False],
        [ True,  True]], dtype=bool)
>>> a == a.T
matrix([[ True, False],
        [False,  True]], dtype=bool)
>>> numpy.nonzero(a == a.T)
(matrix([[0, 1]]), matrix([[0, 1]]))

谢谢,这样我就可以找出矩阵中相关的单元格了。这涵盖了我的第一个代码块。但是,我该如何从这个布尔矩阵中获取索引呢?因为没有索引,我无法访问TT数组。 - user2303141

2
这个怎么样:
a = np.array([[1,0,3,4],[0,5,4,6],[7,4,4,5],[3,4,5,6]])

np.fill_diagonal(a, 0) # changes original array, must be careful

overlap = (a == a.T) * a
indices = np.argwhere(overlap != 0)

结果:

>>> a
array([[0, 0, 3, 4],
       [0, 0, 4, 6],
       [7, 4, 0, 5],
       [3, 4, 5, 0]])
>>> overlap
array([[0, 0, 0, 0],
       [0, 0, 4, 0],
       [0, 4, 0, 5],
       [0, 0, 5, 0]])
>>> indices
array([[1, 2],
       [2, 1],
       [2, 3],
       [3, 2]])

非常好的方法。我的对角线已经为零了。暂时这是我最喜欢的方法。 - user2303141

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接