gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:10:39 24 4
gpt4 key购买 nike

我有以下曲线:

curve with 2 y values for one x

我正在尝试检索与一个 x 值(此处为 0)相对应的两个 y 值。

我已经尝试过来自 scipyinterp1d 但这仅适用于单调增加或减少的曲线。在本例中,它找到两个最接近的值,并在它们之间进行线性插值,结果仅得出一个位于 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))

最佳答案

您可以尝试的一种方法是将输入分解为接近您所需的 x 值的 block (我将您的变量重命名为更接近它们在图中的位置):

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)

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

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]]]

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

关于python - 在python中查找与1个 'y'值对应的两个 'x'值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896408/

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