1

我有一个 numpy 浮点数组,打印时看起来像这样: 在此处输入图像描述

红色圆圈是原始值,蓝色十字是使用 的线性插值numpy.interp

我想使用scipy.optimize.bisect(例如)找到这个numpy数组(红色圆圈)的过零的横坐标。由于这是一个 numpy 数组(而不是函数),我无法将其直接传递给scipy.optimize.bisect. 所以我想传递一个函数,将 numpy 数组插值平分。这是我目前使用的代码:

def Inter_F(x,xp,fp):
    return np.interp(x,xp,fp)
Numpyroot = scp.optimize.bisect(Inter_F,0,9,args=(XNumpy,YNumpy)) 

我找到了一个看起来正确的值,Numpyroot = 3.376425289196618。
我想知道:

  • 如果这是在 numpy 数组上使用 scipy.optimize.bisect 的正确技术方法?特别是当我要对不同的 numpy 值集执行 10^6 次时。
  • 如果执行线性插值不会影响 bisect 将要找到的结果,如果是,是否有更好的选择?

这是两个numpy数组:

XNumpy = array([ 0.   ,  1.125,  2.25 ,  3.375,  4.5  ,  5.625,  6.75 ,  7.875,  9.   ])
YNumpy = array([ -2.70584242e+04,  -2.46925289e+04,  -1.53211676e+04,
        -2.30000000e+01,   1.81312104e+04,   3.41662461e+04,
         4.80466863e+04,   5.75113178e+04,   6.41718009e+04])
4

1 回答 1

2

我认为你的做法是正确的。但是,还有一种更简洁的方法。

import numpy as np
from scipy.interpolate import interp1d


XNumpy = np.array([0., 1.125, 2.25, 3.375, 4.5, 5.625, 6.75, 7.875, 9.])
YNumpy = np.array([
    -2.70584242e+04, -2.46925289e+04, -1.53211676e+04,
    -2.30000000e+01, 1.81312104e+04, 3.41662461e+04,
    4.80466863e+04,   5.75113178e+04,   6.41718009e+04
]) 

invf = interp1d(YNumpy, XNumpy)
print(invf(0))

结果:

array(3.376425289199028)

这里我使用scipy.interpolate.interp1d返回一个函数。我还对反函数进行插值,以便轻松计算横坐标。当然你可以用 来做同样的事情np.interp,我只是喜欢scipy.interpolate.interp1d因为它返回一个函数,所以我可以x从任何给定的值计算y值。

于 2017-02-07T18:40:15.270 回答