我正在运行以下代码。由于我是python的新手,我试图理解为什么我得到TypeError以及如何解决它。非常感谢您的帮助。
import matplotlib
matplotlib.use('SVG')
import matplotlib.pyplot as pyplot
import random
from numpy import array as ar
import math
N = 1000
data = [random.random() for i in range(N)]
x = ar(data)
a = 1.000000
y = (-1.000000) * a * math.log(x)
'''
pyplot.axis([0, 1, 0, 1])
'''
pyplot.xticks([0.1*k for k in range(0,1)])
'''
pyplot.yticks([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
'''
pyplot.title('ElegantPDF')
pyplot.xlabel('x')
pyplot.ylabel('PDF(x)')
xminus = [0] * N
xplus = [0] * N
yminus = [0] * N
yplus = [0] * N
pyplot.plot(x,y, color='blue', linestyle='', marker='o', label='Probability Distribuiton Function')
pyplot.errorbar(x, y, xerr=(xminus, xplus), yerr=(yminus, yplus), ecolor='green', elinewidth=2.0, capsize=20.0)
pyplot.legend(title='The legend')
pyplot.savefig('Elegant.svg')
回溯(最近一次呼叫最后):文件" ElegantPDF.py",第15行, y =(-1.000000)* a * math.log(x)TypeError:只能将length-1数组转换为Python标量
答案 0 :(得分:2)
发生错误是因为math.log()
需要标量或标量数组。
import math
import numpy as np
math.log(np.array([3, 4])) # will fail
math.log(np.array([3])) # same as math.log(3)
如果要计算所有元素的日志,请改用np.log()
。
np.log(np.array([3, 4])) # will get array([ 1.09861229, 1.38629436])
答案 1 :(得分:1)
math.log函数期望标量作为其输入参数,而x是数组。
以下行应该解决问题:
y = [ math.log(x[i]) for i in range(0,len(x)) ]
相当于y = np.log(x)