【问题标题】:Sum of absolute off-diagonal differences in numpy matrixnumpy矩阵中的绝对非对角差之和
【发布时间】:2017-04-20 22:09:59
【问题描述】:

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

我有蛮力代码可以做到这一点,但似乎应该有一个更通用的 numpy 解决方案适用于任何二维矩阵,使用像 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 中进行矢量化,避免这样的蛮力循环?

【问题讨论】:

    标签: python-3.x numpy matrix


    【解决方案1】:

    如果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,因为我们从不对对角线上的元素求和。

    【讨论】:

    • 认为你需要nansum 来避免m 带有0 值。
    • 领先我一分钟。 np.nansum 忽略 m 为零的条目。求和前还需要检查inf(根据bruteforce中的计算)。
    • 为了性能,我建议使用掩码而不是nansum
    • @Divakar 和 Paul,感谢 cmets,我更新了答案。
    • 我不确定更新后的函数 find_s 是否有效。求和前需要使用d!=0的掩码。
    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 2018-08-10
    • 2015-11-13
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多