python-3.x - numpy 矩阵中的绝对非对角差之和

标签 python-3.x numpy matrix

我有一个 2d numpy 矩阵,想要计算以下测试统计量。

enter image description here

我有暴力代码来做到这一点,但似乎应该有一个更通用的 numpy 解决方案,适用于任何 2D 矩阵,使用诸如 np.diag() 之类的东西。但我还是想不通。

def bruteforce(m):
    s = 0.0
    for (i,j) in itertools.product(range(0,m.shape[0]),range(0,m.shape[0])):
        if i<j:
            n = (m[i,j]-m[j,i])**2
            d = m[i,j]+m[j,i]
            if float(d) != 0.:
                s = s+(float(n)/float(d)) 
            else:
                return('NA')
    return(s)

在本例中,m 是一个 NxN 整数矩阵。有没有办法在 numpy 中进行矢量化,避免像这样的暴力循环?

最佳答案

如果m是方阵,这将完成这项工作:

import numpy as np
np.sum((m-m.T)**2/(m+m.T))/2

这是一个涵盖分母为 0 的情况的函数:

def find_s(m):
    d=(m+m.T)
    off_diag_indices=np.triu_indices(len(d),1)
    if 0 in d[off_diag_indices]:
        return 'NA'
    else:
        numerator=(m-m.T)**2
        denominator=m+m.T
        return np.sum(numerator[off_diag_indices]/denominator[off_diag_indices])

我使用 off_diag_indices 的原因是我们实际上允许 m+m.T 对角线上有 0,因为我们从不对对角线上的元素求和。

关于python-3.x - numpy 矩阵中的绝对非对角差之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43530744/

相关文章:

python - iokit.IOServiceGetMatchingServices 在 Python3 下损坏?

python - 根据列中的重复值有条件地复制数据

python - Python 3.52 中的字符串或对象比较

python - numpy:矩阵乘法比向量的总和快吗?

arrays - 在锯齿状的二维网格上向外螺旋

r - 如何根据另一行重新排列矩阵,data.frame或vector的行

java - 如何在 Java 中存储类似 Matrix 或 Table 的数据并有效地从中检索?

python-3.x - 如何使用 keras/tensorflow 构建无监督的 CNN 模型?

python - matplotlib 调整颜色条

python - Python 数组中非常小的数字会导致精度损失