2017-04-20 72 views
2

我有一個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,避免這樣的暴力循環?

回答

5

如果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