numpy矩阵中的绝对非对角线差异总和

问题描述:

我有一个2d numpy矩阵,并且想要计算以下测试统计量。numpy矩阵中的绝对非对角线差异总和

enter image description here

我有蛮力代码来做到这一点,但它似乎应该有一个更一般的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是整数的N×N矩阵。有没有办法做到这一点矢量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,因为我们从未总和对角线上的元素。

+0

像魔术一样。但它绝对有道理。谢谢。 – roblanf

+0

不客气:) –

+1

认为你需要'nansum'来避免'm'带'0'值。 – Divakar