在python中查找与1'x'值对应的两个'y'值

2024-10-05 13:11:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下曲线:

curve with 2 y values for one x

我试图检索对应于一个x值(这里是0)的两个y值。你知道吗

我试过从scipy开始interp1d,但这只适用于单调递增或递减曲线。在本例中,它找到两个最接近的值,并在它们之间进行线性插值,结果只有一个值位于3.9左右。你知道吗

下面是重现示例的代码片段:

from scipy import interpolate
import numpy as np

testdata = np.linspace(0,2*np.pi,100)
testy = np.cos(testdata)

fig, ax = plt.subplots()
ax.plot(testy, testdata)
ax.axvline(0, c = 'r')
f = interpolate.interp1d(testy, testdata)

print(f(0))

检索这些值的好方法是什么?我也试图得到最接近的价值,但这是不够准确的,我计划使用它。你知道吗

谢谢你的帮助

编辑:

下面的解决方案是可行的,但是有更好的方法吗?你知道吗

testdata = np.linspace(0,2*np.pi,100)
testy = np.cos(testdata)

gradx = np.gradient(testy)
asign = np.sign(gradx)
signchange = ((np.roll(asign, 1) - asign) != 0).astype(int)
splitloc = [i for i, e in enumerate(signchange) if e != 0]
newdata = np.split(testy,splitloc)
newx = np.split(testdata,splitloc)

fig, ax = plt.subplots()

for i in range(len(splitloc)):
    ax.plot(newdata[i+1], newx[i+1])
    f = interpolate.interp1d(newdata[i+1], newx[i+1])
    print(f(0))

Tags: importnppiscipyax曲线testdatainterpolate
2条回答

由于你要插值的数据不是一个函数,我想用插值法来解决你的问题是很困难的。但是你可以看到如果你把连续的值乘以x,所有值的符号都是(+),除了在最近的点上x=0会有符号变化(-)。通过使用:

vals=[testdata[j] for j in range(len(testy)-1) if np.sign(testy[j]*testy[j+1])==-1]

我得到[1.5231964381041423, 4.696522350821105]。您可以使用jj+1覆盖testdata[j]因为网格是一致的,两种近似都会有相同的错误量。希望有帮助。你知道吗

您可以尝试的一种方法是将输入分解为接近所需x值的块(我重命名了变量,使其更接近绘图中的变量):

test_y = np.linspace(0,2*np.pi,100)
test_x = np.cos(test_y)
# Determine which parts are close to zero
close_to_zero = np.isclose(test_x, 0, atol=1e-1)

现在我们可以将您的输入分解为接近零的“连续”块:

chunks = []
prev_close = False
for x, y, close in zip(test_x, test_y, close_to_zero):
    if not close:
        if prev_close:
            chunks.append(chunk)
    if close:
        if not prev_close:
            chunk=[[y], [x]]
        chunk[0].append(y)
        chunk[1].append(x)
    prev_close = close
chunks

输出:

[[[1.5231964381041423,
   1.5231964381041423,
   1.5866629563584815,
   1.6501294746128208],
  [0.04758191582374218,
   0.04758191582374218,
   -0.01586596383480803,
   -0.07924995685678855]],
 [[4.6330558325667655,
   4.6330558325667655,
   4.696522350821105,
   4.759988869075444],
  [-0.07924995685678878,
   -0.07924995685678878,
   -0.01586596383480761,
   0.04758191582374238]]]

现在可以迭代(y, x)中的chunks列表对,并对这些对进行线性插值以获得更精确的值。你知道吗

相关问题 更多 >

    热门问题