【发布时间】:2018-10-05 14:39:46
【问题描述】:
假设我有以下 3d-Numpy-array A:
array([[[ 1, 2, 3],
[ 1, 4, 9]],
[[ 1, 8, 27],
[ 1, 16, 81]]])
我想同时使用interp1d 和axis=2 插值数据,即同时插值函数值1,2,3、1,4,9、1,8,27 和1,16,81 和x=np.array([1,2,3])(这些值代表 f(x )=x, x^2, x^3 和 x^4)。
幸运的是,这是可能的,因为 interp1d 能够将 ND 数组作为第二个参数,只要插值轴等于 x 的长度:
f = interp1d(x,A,kind='linear',axis=2,fill_value='extrapolate')
到目前为止,这工作得很好,f(1) 产生
array([[1., 1.],
[1., 1.]]),
f(2) 产生
array([[ 2., 4.],
[ 8., 16.]])
插值 f(1.5) 产生
array([[1.5, 2.5],
[4.5, 8.5]])
即我得到一个 2x2 的插值函数数组 f(x),在 x 处求值。
现在问题来了:我想反转这些插值函数以获得特定函数值的 x - 2x2 数组的每个条目的元素明智。
在处理一维函数 g 时,这通常通过找到插值函数的根减去请求的函数值来完成,比如 a:
g_subtracted = lambda x: f(x) - a
并找到零,例如使用 scipy.optimize.newton:
optimize.newton(g_subtracted,1.0)
其中 1.0 是初始猜测。
这是我的实际问题:我怎样才能找到我的 2x2 interp2d 函数数组 f 元素的零?当我简单地做
f_subtracted = lambda x: f(x) - a
(这适用于我的函数数组)然后
optimize.newton(f_subtracted,1.0)
我收到以下错误:
File "<ipython-input-187-4cf34581a978>", line 1, in <module>
newton(f,1.0)
File "/anaconda3/lib/python3.6/site-packages/scipy/optimize/zeros.py", line 201, in newton
if q1 == q0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
在我看来,optimize.newton 无法处理“函数数组”作为输入来逐元素评估它们。有人知道怎么做吗?
提前非常感谢!
【问题讨论】:
标签: python arrays numpy scipy interpolation