TypeError: only size-1 arrays can be converted to Python scalars when trying to plot a function
TypeError: only size-1 arrays can be converted to Python scalars when trying to plot a function
我有当前代码:
from math import cos, sin, pi
import numpy as np
import matplotlib.pyplot as plt
def f(x):
values = []
s = 0
for n in range(1, 6, 1):
s += -((2/(n*pi))*(((cos((n*pi)/2))-1)*(sin((n/2)*x))))
values.append(s)
return values
x = np.linspace(-2*pi, 6*pi, 500)
plt.plot(f(x))
我应该绘制 f(x),但是当我 运行 代码时,我得到这个错误:
TypeError: only size-1 arrays can be converted to Python scalars
关于我做错了什么有什么想法吗?
如有任何帮助,我们将不胜感激!
我认为公式中的x
值只适用于x
的一个值,而且由于你有多个x
以列表的形式,你必须迭代通过它们中的每一个(例如,使用 for xval in x:
),执行计算并将计算值附加到 values
列表
from math import cos, sin, pi
import numpy as np
import matplotlib.pyplot as plt
def f(x):
values = []
for xval in x:
s = 0
for n in range(1, 6, 1):
s += -((2/(n*pi))*(((cos((n*pi)/2))-1)*(sin((n/2)*xval))))
values.append(s * -1)
return values
x = np.linspace(-2*pi, 6*pi, 500)
plt.plot(f(x))
plt.show()
如果您是编程新手,这可能与您现在正在做的有点不同,但是我基本上将函数拆分来解释每个组件的作用,更重要的是,使用了 numpy 的内置函数这将证明比嵌套循环更有效,尤其是当您的数据变大时。
要了解函数 f
发生了什么,请在 Python 中查找(列表)理解,但它基本上是一个用单行表示的 for
循环。
In [24]: import numpy as np
...: import matplotlib.pyplot as plt
In [25]: def summand(n, x):
...: """ Return an array of `x`'s size for a given value of `n`.
...: Each element of the array is a value of the function computed
...: at a value in `x` with the given `n`.
...: """
...: return (2 / (n * np.pi)) * (np.cos(n * np.pi / 2) - 1) * np.sin(n * x / 2)
...:
In [26]: def f(x, N=5):
...: """ Return the sum of the summands computed for
...: values of `n` ranging from 1 to N+1 with a given array `x`
...: """
...: return sum(summand(n, x) for n in range(1, N+1))
...:
In [27]: x = np.linspace(-2*np.pi, 6*np.pi, 500)
In [28]: plt.plot(x, f(x))
Out[28]: [<matplotlib.lines.Line2D at 0x23e60b52a00>]
In [29]: plt.show()
我有当前代码:
from math import cos, sin, pi
import numpy as np
import matplotlib.pyplot as plt
def f(x):
values = []
s = 0
for n in range(1, 6, 1):
s += -((2/(n*pi))*(((cos((n*pi)/2))-1)*(sin((n/2)*x))))
values.append(s)
return values
x = np.linspace(-2*pi, 6*pi, 500)
plt.plot(f(x))
我应该绘制 f(x),但是当我 运行 代码时,我得到这个错误:
TypeError: only size-1 arrays can be converted to Python scalars
关于我做错了什么有什么想法吗?
如有任何帮助,我们将不胜感激!
我认为公式中的x
值只适用于x
的一个值,而且由于你有多个x
以列表的形式,你必须迭代通过它们中的每一个(例如,使用 for xval in x:
),执行计算并将计算值附加到 values
列表
from math import cos, sin, pi
import numpy as np
import matplotlib.pyplot as plt
def f(x):
values = []
for xval in x:
s = 0
for n in range(1, 6, 1):
s += -((2/(n*pi))*(((cos((n*pi)/2))-1)*(sin((n/2)*xval))))
values.append(s * -1)
return values
x = np.linspace(-2*pi, 6*pi, 500)
plt.plot(f(x))
plt.show()
如果您是编程新手,这可能与您现在正在做的有点不同,但是我基本上将函数拆分来解释每个组件的作用,更重要的是,使用了 numpy 的内置函数这将证明比嵌套循环更有效,尤其是当您的数据变大时。
要了解函数 f
发生了什么,请在 Python 中查找(列表)理解,但它基本上是一个用单行表示的 for
循环。
In [24]: import numpy as np
...: import matplotlib.pyplot as plt
In [25]: def summand(n, x):
...: """ Return an array of `x`'s size for a given value of `n`.
...: Each element of the array is a value of the function computed
...: at a value in `x` with the given `n`.
...: """
...: return (2 / (n * np.pi)) * (np.cos(n * np.pi / 2) - 1) * np.sin(n * x / 2)
...:
In [26]: def f(x, N=5):
...: """ Return the sum of the summands computed for
...: values of `n` ranging from 1 to N+1 with a given array `x`
...: """
...: return sum(summand(n, x) for n in range(1, N+1))
...:
In [27]: x = np.linspace(-2*np.pi, 6*np.pi, 500)
In [28]: plt.plot(x, f(x))
Out[28]: [<matplotlib.lines.Line2D at 0x23e60b52a00>]
In [29]: plt.show()