当x是数字数组时,在python中绘制f(x)时出错

时间:2012-09-14 16:09:45

标签: python numpy

我刚开始尝试学习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)

2 个答案:

答案 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模块的操作。
  • 来自NumPy的操作,适用于ndarrays(NumPy数组)。 import numpy as np或多或少是传统的。{/ 1}。

math模块中的函数仅适用于float 标量。如果要在一组标量(列表,数组......)上使用math函数,则必须通过迭代将其应用于集合的每个项目。这就是您在构建r列表时正在执行的操作:您的循环可以转换为r = [math.pow(10,x) for x in i]

相反,NumPy是专为处理大型数据阵列而设计的。阵列上的操作直接在C级执行,这比我描述的迭代方法快得多且效率更高。使用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