np.piecewise()使用math.pow()进行操作?

时间:2015-05-29 16:54:09

标签: python numpy

我一直试图将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()会破坏一切。

发生了什么事?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

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 sum函数,以获得更好的性能。