numpy矩阵中的绝对非对角线差异总和
问题描述:
我有一个2d numpy矩阵,并且想要计算以下测试统计量。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
是整数的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,因为我们从未总和对角线上的元素。
像魔术一样。但它绝对有道理。谢谢。 – roblanf
不客气:) –
认为你需要'nansum'来避免'm'带'0'值。 – Divakar