我一直试图让numpy.piecewise将系数{a_ij}的列表转换为分段三次多项式。每当我运行以下代码时,
import math
import numpy as np
x = np.linspace(0.1,9.9,100)
a = [[i] * 4 for i in range(10)]
x_i = [0,1,2,3,4,5,6,7,8,9,10]
condlist = [(x[i] < x)*(x<x_i[i+1]) for i in range(len(x_i)-1)]
funclist = [lambda y: sum([a[k][j] * math.pow(y - x_i[k],j) for j in range(4)]) for k in range(len(a))]
print np.piecewise(x, condlist, funclist)我知道错误了
...line 730, in piecewise
y[condlist[k]] = item(vals, *args, **kw)
File "test", line 8, in <lambda>
funclist = [lambda y: sum([a[k][j] * math.pow(y - x_i[k],j) for j in range(4)]) for k in range(len(a))]
TypeError: only length-1 arrays can be converted to Python scalars但是,只有当我去掉math.pow()时,错误才会消失。出于某种原因,让funclist将x传递到math.pow()是什么破坏了一切的原因。
到底怎么回事?我怎么才能解决这个问题?
发布于 2015-05-29 17:05:41
math模块中的函数使用数字标量作为参数。他们不期望NumPy数组。funclist中的函数正在传递一个NumPy数组y。因此,math.pow(y-constant, j)提出了一个TypeError:
In [22]: y = np.arange(5)
In [31]: math.pow(y - 1, 2)
TypeError: only length-1 arrays can be converted to Python scalars使用np.power而不是math.pow
funclist = [lambda y: ([a[k][j] * np.power(y - x_i[k],j) for j in range(4)]).sum()
for k in range(len(a))]注意:为了获得更好的性能,您也应该调用NumPy sum方法,而不是使用Python函数。
https://stackoverflow.com/questions/30535078
复制相似问题