我有一个 2d numpy 矩阵,想要计算以下测试统计量。
我有暴力代码来做到这一点,但似乎应该有一个更通用的 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/