计算 numpy histogram2d 数据的中值
Compute median for numpy histogram2d data
我在 x 和 y 中有一些数据。然后我将 x bin 中的数据归一化,使 xbin 中的所有数据总和为 1...所以我对每个 x 处的每个 y 值都有一个归一化概率。
nA, binsx, binsy = np.histogram2d(dataA,dataB,
bins=[binsA,binsB],normed=False)
H = np.ma.masked_where(nA==0.0, nA)
for i in range(len(H[0,:])): # Column index i, over len of row 0
colTot = np.sum(H[:,i])
for j in range(len(H[:,0])): # Row index j, over len of column 0
H[j,i] = H[j,i]/colTot
此时 H 沿列归一化...每个总和为 1。
我的问题是,如何有效地生成每列中的中值?我相信我需要为每一列(或 xbin 中的一组值)生成一个新数组,它的 y 值数量等于该 ybin 的原始 (nA) 计数。好像很绕……有没有更简单的方法?
这是我现在正在尝试的:
nA, binsx, binsy = np.histogram2d(dataA,dataB,
bins=[binsA,binsB],normed=False)
for j in range(nA[0,:].size): # Loop over number of columns
oneMass = np.array([])
for i in range(nA[:,0].size): # loop over rows in y...
tmp = np.repeat(binsA[i],np.int32(nA[i,j]))
if tmp.size > 0:
oneMass = np.concatenate((oneMass,tmp) )
print('Median',np.median(oneMass))
如果您已经对列进行了归一化,您可以对累积概率函数进行 .5 的线性插值:
cumCols = np.cumsum(H, axis = 1)
medians = np.array([np.interp(.5, binsA, cumCols[:,i]) for i in range(len(binsA))])
我在 x 和 y 中有一些数据。然后我将 x bin 中的数据归一化,使 xbin 中的所有数据总和为 1...所以我对每个 x 处的每个 y 值都有一个归一化概率。
nA, binsx, binsy = np.histogram2d(dataA,dataB,
bins=[binsA,binsB],normed=False)
H = np.ma.masked_where(nA==0.0, nA)
for i in range(len(H[0,:])): # Column index i, over len of row 0
colTot = np.sum(H[:,i])
for j in range(len(H[:,0])): # Row index j, over len of column 0
H[j,i] = H[j,i]/colTot
此时 H 沿列归一化...每个总和为 1。
我的问题是,如何有效地生成每列中的中值?我相信我需要为每一列(或 xbin 中的一组值)生成一个新数组,它的 y 值数量等于该 ybin 的原始 (nA) 计数。好像很绕……有没有更简单的方法?
这是我现在正在尝试的:
nA, binsx, binsy = np.histogram2d(dataA,dataB,
bins=[binsA,binsB],normed=False)
for j in range(nA[0,:].size): # Loop over number of columns
oneMass = np.array([])
for i in range(nA[:,0].size): # loop over rows in y...
tmp = np.repeat(binsA[i],np.int32(nA[i,j]))
if tmp.size > 0:
oneMass = np.concatenate((oneMass,tmp) )
print('Median',np.median(oneMass))
如果您已经对列进行了归一化,您可以对累积概率函数进行 .5 的线性插值:
cumCols = np.cumsum(H, axis = 1)
medians = np.array([np.interp(.5, binsA, cumCols[:,i]) for i in range(len(binsA))])