0

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

2 回答 2

1

Are you using the functions in the correct module? Python's built-in math.cos only takes a single scalar value, whereas numpy.cos takes arrays as well:

>>> 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 ])
于 2012-09-14T16:11:52.333 回答
0

你的主要问题是你混合了两种类型的数学运算

  • 模块的操作math
  • 来自NumPy的操作,适用于ndarrays(NumPy 数组)。这或多或少是传统的import numpy as np

模块中的函数仅math适用于浮点标量。如果你想math在一组标量(一个列表、一个数组......)上使用一个函数,你必须通过迭代将它应用于你的集合的每个项目。这就是您在构建r列表时当前正在做的事情:您的循环可以转换为r = [math.pow(10,x) for x in i]

相反,NumPy 是为处理大型数据数组而设计的。对数组的操作直接在 C 级别执行,这比我描述的迭代方法要快得多,效率更高。使用np函数时,输入集在底层转换为 a ndarray

例如,您可以使用以下函数r非常有效地创建数组:np.power

r = np.power(10., i)

(请注意,我正在使用10.而不是10强制输出数组具有 float 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)部分,您应该使用. 另一种方法是迭代并创建一个类似的数组,但它首先完全违背了使用的意义。xndarraynp.sinxnp.array([math.sin(i+1.2) for i in x])ndarrays

在您提到的最后一个示例中,缺少一个步骤:

from numpy import sin

您现在必须记住这sin是 NumPy 函数,而不是它的math对应函数。由于存在混淆的风险,您可能不应该单独导入函数并np.sin改为使用。

于 2012-09-15T13:38:16.830 回答