gpt4 book ai didi

python - np.piecewise() 与 math.pow() 一起使用?

转载 作者:行者123 更新时间:2023-11-30 23:10:48 25 4
gpt4 key购买 nike

我一直在尝试让 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() 会破坏一切。

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

最佳答案

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 函数。

关于python - np.piecewise() 与 math.pow() 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com