如何修复Python3中类型转换对应的TypeError?

如何修复Python3中类型转换对应的TypeError?,python,numpy,matplotlib,Python,Numpy,Matplotlib,我正在运行以下代码。由于我是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 =

我正在运行以下代码。由于我是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')
回溯(最近一次调用last):文件“ElegantPDF.py”,第15行,在
y=(-1.000000)*a*math.log(x)TypeError:只有长度为1的数组才能转换为Python标量

发生错误的原因是
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])

发生错误的原因是
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])

当x是数组时,math.log函数需要一个标量作为其输入参数

以下行应解决此问题:

y = [ math.log(x[i]) for i in range(0,len(x)) ]

它相当于
y=np.log(x)
math.log函数需要一个标量作为其输入参数,而x是一个数组

以下行应解决此问题:

y = [ math.log(x[i]) for i in range(0,len(x)) ]

它相当于
y=np.log(x)

可能:
x
是一个数组,
math.log(x)
需要一个数字。可能:
x
是一个数组,
math.log(x)
需要一个数字。我将对应的行更改为y=(-1.000000)*a*np.log(np.x)现在它给了我以下错误:回溯(最近一次调用上次):文件“ElegantPDF.py”,第16行,y=(-1.000000)*a*np.log(np.x)AttributeError:“module”对象没有属性“x”@Ashur-Nah,你应该只做
np.log(x)
x
这是您的数组,它必须是函数的参数。我只是动态创建了我的数组,因此我做了
np.array([3,4])
。这与执行
data=[3,4]相同;x=ar(data)
基于代码的语法。下面的方法实际上是有效的:np.log(x),因为x已经被视为数组,而该行自动(令人惊讶地)将x记忆为数组。谢谢你给我一个线索。现在,我在绘图中有一个新的警告,它与绘图设置有关。如果我无法解决绘图设置的小问题,我将更新您。@Ashur奖励回合。pyplot.errorbar()
中的
xerr
后缺少等号。类似地,您可能还希望在那里添加一个
linestyle='''`参数,以消除错误条之间的任何链接行。直到误差条的大小大于0,你才会看到误差条。例如,试试
xminus=[1]*N
xplus=[2]*N
。最后,
elinewidth
具有极高的价值。试着把它调小一点,或者完全去掉它。为了将来的参考,如果您有一个与原始问题无关的后续问题,最好是问一个新问题。我将相应的行更改为y=(-1.000000)*a*np.log(np.x),现在它给了我以下错误:回溯(最后一次调用):文件“ElegantPDF.py”,第16行,y=(-1.000000)*a*np.log(np.x)AttributeError:“module”对象没有属性“x”@Ashur-Nah,您应该只执行
np.log(x)
x
这是您的数组,它必须是函数的参数。我只是动态创建了我的数组,因此我做了
np.array([3,4])
。这与执行
data=[3,4]相同;x=ar(data)
基于代码的语法。下面的方法实际上是有效的:np.log(x),因为x已经被视为数组,而该行自动(令人惊讶地)将x记忆为数组。谢谢你给我一个线索。现在,我在绘图中有一个新的警告,它与绘图设置有关。如果我无法解决绘图设置的小问题,我将更新您。@Ashur奖励回合。pyplot.errorbar()
中的
xerr
后缺少等号。类似地,您可能还希望在那里添加一个
linestyle='''`参数,以消除错误条之间的任何链接行。直到误差条的大小大于0,你才会看到误差条。例如,试试
xminus=[1]*N
xplus=[2]*N
。最后,
elinewidth
具有极高的价值。试着把它调小一点,或者完全去掉它。为了便于将来参考,如果您有一个与原始问题无关的后续问题,最好是提出一个新问题。这可以简化为
y=[math.log(i)For i in x]
。但是,这仅适用于1d阵列。对于多维数组,每个
i
将不是标量,您将遇到相同的问题,而
np.log()
将在不考虑形状的情况下应用操作元素。此外,
np.log()
是矢量化的,操作比Python级循环快得多。这可以简化为
y=[math.log(i)for i in x]
。但是,这仅适用于1d阵列。对于多维数组,每个
i
将不是标量,您将遇到相同的问题,而
np.log()
将在不考虑形状的情况下应用操作元素。此外,
np.log()。