1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| import numpy as np import pandas as pd
def getMoranV(path,val=1,t=0,method="Moran"): ''' :param path: 图像路径 :param t: 卷积核类型 :param method: 空间自相关方法 :param val: 空间权重 :return: ''' wb1 = pd.read_excel(path, index_col=0) data = wb1.values n, m = wb1.shape
dir2 = [[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [1, -1], [-1, 1], [-1, -1]] dir1 = [[1, 0], [0, 1], [-1, 0], [0, -1]] dir3=[[1,1],[1,-1],[-1,1],[-1,-1]]
if t==0: dir=dir1 elif t==1: dir=dir2 else: dir=dir3
a = [[] for _ in range(n*m)] a_weight=0 for i in range(n): for j in range(m): loc=i*m+j for detX, detY in dir: x = i + detX y = j + detY if 0 <= x < n and 0 <= y < m: a[loc].append([x,y,val]) a_weight+=val
def moranIndex(data,weight): s_0=a_weight n,m=len(data),len(data[0]) x_hat=np.mean(data) up_sum=0 down_sum=0 for i in range(n): for j in range(m): loc=i*m+j for v in weight[loc]: up_sum+=v[2]*(data[i][j]-x_hat)*(data[v[0]][v[1]]-x_hat) down_sum+=(data[i][j]-x_hat)**2 return (n*m/s_0)*(up_sum/down_sum)
def Geary_C(data,weight): s_0=a_weight*2 n, m = len(data), len(data[0]) x_hat = np.mean(data) up_sum = 0 down_sum = 0 for i in range(n): for j in range(m): loc = i * m + j for v in weight[loc]:
up_sum += v[2] * (data[i][j] - data[v[0]][v[1]])**2 down_sum += (data[i][j] - x_hat) ** 2 return ((n*m-1)/(s_0))*(up_sum/down_sum)
if (M:=method.upper())=="MORAN": return moranIndex(data,a) elif M=="GEARY": return Geary_C(data,a)
def getHelp(): print("Method: {'Moran','Geary'}") print("t: {0:Rook,1:Queen,2:bishop}")
if __name__ == '__main__': getHelp() path = r"\data.xlsx" print("墨兰指数为: %s"%getMoranV(path,val=1,t=0)) print("Geary's C为: %s"%getMoranV(path,val=1,t=0,method="Geary"))
|