我刚开始尝试学习python。我无法绘制函数。我从网上跟踪示例,似乎工作正常。但是,当我在我自己的东西上尝试时,我得到一个错误,该函数只能将长度为1的数组用作标量,但我没有看到我自己的尝试然后复制绘图示例的差异。我的代码如下:
i = np.arange(-16, -7, 1)
r = []
y = []
for x in i:
r.append(math.pow(10, x))
x = np.asarray(r)
y = (math.cos(1.2) - (1 / x) * (math.sin(1.2 + x) - math.sin(1.2)))
plot(x,y)
show()
基本上我只想为值y=f(x)
输出10^-16, 10^-15...10^-7
。但我发誓我发现的所有绘图实例都以同样的方式实现它。例如,这很好用:
x = arange(0, 2, 0.01)
y = 2 * sin(2 * pi * (x - 1 / 4))
plot(x, y)
答案 0 :(得分:1)
您使用的是正确模块中的功能吗? Python的内置math.cos
只接受一个标量值,而numpy.cos
也接受数组:
>>> import numpy
>>> import math
>>> math.cos([1, 2, 3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a float is required
>>> numpy.cos([1, 2, 3])
array([ 0.54030231, -0.41614684, -0.9899925 ])
答案 1 :(得分:0)
你的主要问题是你正在混合两种类型的数学运算
math
模块中的函数仅适用于float 标量。如果要在一组标量(列表,数组......)上使用math
函数,则必须通过迭代将其应用于集合的每个项目。这就是您在构建r
列表时正在执行的操作:您的循环可以转换为r = [math.pow(10,x) for x in i]
np
函数时,输入集将转换为引擎盖下的ndarray
。
例如,您可以使用r
函数非常有效地创建np.power
数组:
r = np.power(10., i)
(请注意,我正在使用10.
而不是10
来强制输出数组具有浮点dtype
。我本可以使用np.power(10, i, dtype=float)
。
您的y
变为:
y = (math.cos(1.2) - (1. / r) * (np.sin(1.2 + r) - math.sin(1.2)))
保持math
计算1.2
的正弦和余弦是可以的,因为它只是一个标量。但对于sin(1.2 + x)
部分,因为x
已经一个ndarray
,您应该使用np.sin
。另一种方法是迭代x
并创建一个类似np.array([math.sin(i+1.2) for i in x])
的数组,但它首先完全违背了使用ndarrays
的要点。
在您提到的最后一个示例中,缺少一个步骤:
from numpy import sin
您现在必须记住sin
是NumPy函数,而不是math
对应函数。由于存在混淆的风险,您可能不应该独立导入函数并改为使用np.sin
。