我正在尝试编写一个简单的程序来绘制x
vs y
。但是,它似乎没有计算y
的正确值。
例如,在第一种情况下x = -1
e^(x^2/2 - x) -1
的值应为3.48
,而是返回1
。
我遇到的另一个错误是它似乎没有绘制x
vs y
,而是为x
的每个值设置一个单独的行。
import numpy as np
import math
import matplotlib.pyplot as plt
x = np.arange(-2, 2)
y = np.arange(-2, 2)
for i in range(-3, 3):
y[i] = math.exp(( x[i]^2/2 ) - x[i])-1
print x, y
plt.plot([x, y])
plt.show()
答案 0 :(得分:3)
内置的numpy
数组操作非常适用于此。
这是你想要的一行:
y = np.exp(np.power(x, 2)/2 - x) - 1
然后完整代码变为
import numpy as np
import math
import matplotlib.pyplot as plt
x = np.arange(-2, 2)
y = np.exp(np.power(x, 2)/2 - x) - 1
print(x, y)
plt.plot(x, y)
plt.show()
(注意,这里也更改了plot
语句)
如果您在使用numpy
时开始编写循环,请寻找其他方法。向量操作可以比相应的python代码快得多(有时几个数量级),这就是人们喜欢它的原因。许多基本操作(+
,-
,*
,/
,**
)甚至超载。查看“参考文献”部分中的最后一项以获取更多信息。
答案 1 :(得分:2)
代码中的问题:
^
而不是指数运算符**
plt.plot()
3/2 -> 1
y[i]
意外地将所有结果舍入为整数,因为y
是作为整数数组生成的(正如@efirvida所解释的那样,这是因为np.arange()
推断出从给定值中输入)这适用于Python 3.4:
import numpy as np
import math
import matplotlib.pyplot as plt
x = np.arange(-2, 2)
y = np.ndarray(len(x), float)
for i in range(len(x)):
y[i] = math.exp(( (x[i]**2)/2.0 ) - x[i])-1
print(x, y)
plt.plot(x, y)
plt.show()
答案 2 :(得分:0)
^
不是Python中的取幂运算符,它是按位XOR。您需要使用**
代替。此外,如果您要在数组上绘制函数,直接编写函数并通过vectorize
应用它会更清晰。
此外,如果您正在使用Python2.7,则应添加from __future__ import division
以获得真(浮点)除法,否则x/2
将使用整数除法。
from __future__ import division
import math
import numpy as np
import matplotlib.pyplot as plt
f = np.vectorize(lambda x: math.exp((x**2/2) - x) - 1)
x = np.arange(-2, 2)
y = f(x)
最后,您需要将x
和y
作为单独的参数传递给plot
,而不是将它们放在列表中:
plt.plot(x, y)
答案 3 :(得分:0)
由于@xnx几天前回答了我的question“NumPy数组有一个固定的数据类型(dtype),如果你没有自己指定它,可以从初始化数据中推断出来。除非你告诉它,它不会改变它到“
这就是这里发生的事情,你正在使用一系列int np.arange(-2,2),然后这个数字没有浮点除法。
import numpy as np
import math
import matplotlib.pyplot as plt
x = np.arange(-2., 2.) #<-- use dots to define a float array
y = []
for i in range(-3, 3):
y.append(math.exp(( x[i]**2/2 ) - x[i])-1)
y = np.array(y)
print x, y
# x = array([-2., -1., 0., 1.])
# y = array([ 3.48168907, 0. , 0.39346934, 53.59815003, 3.48168907, 0.])