首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >np.piecewise()与使用math.pow()有关吗?

np.piecewise()与使用math.pow()有关吗?
EN

Stack Overflow用户
提问于 2015-05-29 16:54:09
回答 1查看 100关注 0票数 1

我一直试图让numpy.piecewise将系数{a_ij}的列表转换为分段三次多项式。每当我运行以下代码时,

代码语言:javascript
复制
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)

我知道错误了

代码语言:javascript
复制
...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()是什么破坏了一切的原因。

到底怎么回事?我怎么才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-29 17:05:41

math模块中的函数使用数字标量作为参数。他们不期望NumPy数组。funclist中的函数正在传递一个NumPy数组y。因此,math.pow(y-constant, j)提出了一个TypeError:

代码语言:javascript
复制
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

代码语言:javascript
复制
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函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30535078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档