两个三维图像互信息python_python – 使用numpy计算成对互信息的最佳方式
對(duì)于m×n矩陣,計(jì)算所有列(n x n)的互信息的最佳(最快)方式是什么?
I(X, Y) = H(X) + H(Y) – H(X,Y)
其中H(X)是指X的香農(nóng)熵。
目前我正在使用np.histogram2d和np.histogram來計(jì)算關(guān)節(jié)(X,Y)和單個(gè)(X或Y)計(jì)數(shù)。對(duì)于給定的矩陣A(例如,一個(gè)250000×1000的浮點(diǎn)矩陣),我正在做一個(gè)嵌套for循環(huán),
n = A.shape[1]
for ix = arange(n)
for jx = arange(ix+1,n):
matMI[ix,jx]= calc_MI(A[:,ix],A[:,jx])
當(dāng)然必須有更好/更快的方式來做到這一點(diǎn)嗎?
除此之外,我還在數(shù)組上的列(列或行操作)上查找映射函數(shù),但還沒有找到一個(gè)很好的一般答案。
這是我的完整實(shí)現(xiàn),遵循the Wiki page中的約定:
import numpy as np
def calc_MI(X,Y,bins):
c_XY = np.histogram2d(X,Y,bins)[0]
c_X = np.histogram(X,bins)[0]
c_Y = np.histogram(Y,bins)[0]
H_X = shan_entropy(c_X)
H_Y = shan_entropy(c_Y)
H_XY = shan_entropy(c_XY)
MI = H_X + H_Y - H_XY
return MI
def shan_entropy(c):
c_normalized = c / float(np.sum(c))
c_normalized = c_normalized[np.nonzero(c_normalized)]
H = -sum(c_normalized* np.log2(c_normalized))
return H
A = np.array([[ 2.0, 140.0, 128.23, -150.5, -5.4 ],
[ 2.4, 153.11, 130.34, -130.1, -9.5 ],
[ 1.2, 156.9, 120.11, -110.45,-1.12 ]])
bins = 5 # ?
n = A.shape[1]
matMI = np.zeros((n, n))
for ix in np.arange(n):
for jx in np.arange(ix+1,n):
matMI[ix,jx] = calc_MI(A[:,ix], A[:,jx], bins)
雖然我的嵌套for循環(huán)的工作版本以合理的速度進(jìn)行,我想知道是否有更好的方法來應(yīng)用calc_MI在A的所有列(以計(jì)算它們的成對(duì)互信息)?
我也想知道:
>是否有有效的方法來映射函數(shù)來操作np.arrays的列(或行)(可能像np.vectorize,它看起來更像一個(gè)裝飾器)?
>這個(gè)具體計(jì)算是否還有其他最佳實(shí)現(xiàn)(互信息)?
總結(jié)
以上是生活随笔為你收集整理的两个三维图像互信息python_python – 使用numpy计算成对互信息的最佳方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: layui移动端适配_实战:移动端适配的
- 下一篇: c++和java哪个难_前端和Java开