只有length-1数组可以使用log转换为Python标量

时间:2015-12-05 19:46:23

标签: python python-2.7 numpy scipy

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

我有这个代码,我不知道可能是什么问题,谢谢你的帮助

1 个答案:

答案 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引用功能可以帮助您避免将来出现此类错误。