Python:TypeError:只有length-1数组可以转换为Python标量

时间:2017-08-20 19:17:56

标签: python matplotlib scipy

我有一个功能

f(x) = sin(x/5.0)*exp(x/10.0) + 5*exp(-x/2.0)

我需要求解线性方程组

w0 + w1x1 + w2(x1)**2 + ... + wn(x1)**n = f(x1)

我解决了这个问题,但我对绘图有问题

from math import sin, exp
from scipy import linalg
import numpy as np

b = []
def f(x):
    return sin(x/5.0)*exp(x/10.0) + 5*exp(-x/2.0)

for i in [1, 15]:
    b.append(f(i))

A = []

for i in [1, 15]:
    ij = []
    x0 = i ** 0
    x1 = i ** 1
    ij.append(x0)
    ij.append(x1)
    A.append(ij)

matrix = np.array(A)
b = np.array(b).T

x = linalg.solve(matrix, b)
from matplotlib import pyplot as plt
plt.plot(x, f(x))

但它返回

TypeError: only length-1 arrays can be converted to Python scalars

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

math.sinmath.exp期望标量输入。如果您传递数组,则会得到TypeError

In [34]: x
Out[34]: array([ 3.43914511, -0.18692825])

In [35]: math.sin(x)
TypeError: only length-1 arrays can be converted to Python scalars

from math import sin, expsin模块加载expmath,并将它们定义为全局命名空间中的函数。因此,f(x)正在math上调用sin x函数的版本,这是一个NumPy数组:

def f(x):
    return sin(x/5.0)*exp(x/10.0) + 5*exp(-x/2.0)

要修正错误,请改用NumPy的sinexp功能。

import numpy as np
def f(x):
    return np.sin(x/5.0)*np.exp(x/10.0) + 5*np.exp(-x/2.0)