from numpy import *
from pylab import *
from scipy import *
from scipy.signal import *
from scipy.stats import *
testimg = imread('path')
hist = hist(testimg.flatten(), 256, range=[0.0,1.0])[0]
hist = hist + 0.000001
prob = hist/sum(hist)
entropia = -1.0*sum(prob*log(prob))#here is error
print 'Entropia: ', entropia
我有这个代码,我不知道可能是什么问题,谢谢你的帮助
答案 0 :(得分:4)
这是为什么你永远不应该使用from module import *
的一个例子。你忽视了功能的来源。当您使用多个from module import *
调用时,一个模块的命名空间可能会破坏另一个模块的命名空间。实际上,基于错误消息,这似乎是这里发生的事情。
请注意,当log
引用numpy.log
时,-1.0*sum(prob*np.log(prob))
可以无误地计算:
In [43]: -1.0*sum(prob*np.log(prob))
Out[43]: 4.4058820963782122
但是当log
引用math.log
时,会引发TypeError:
In [44]: -1.0*sum(prob*math.log(prob))
TypeError: only length-1 arrays can be converted to Python scalars
修复方法是使用显式模块导入和对模块命名空间中函数的显式引用:
import numpy as np
import matplotlib.pyplot as plt
testimg = np.random.random((10,10))
hist = plt.hist(testimg.flatten(), 256, range=[0.0,1.0])[0]
hist = hist + 0.000001
prob = hist/sum(hist)
# entropia = -1.0*sum(prob*np.log(prob))
entropia = -1.0*(prob*np.log(prob)).sum()
print 'Entropia: ', entropia
# prints something like: Entropia: 4.33996609845
您发布的代码不会产生错误,但实际代码log
中的某个地方必须绑定到math.log
而不是numpy.log
。使用import module
并使用module.function
引用功能可以帮助您避免将来出现此类错误。