获取给定x的y值

时间:2016-10-25 14:18:18

标签: numpy matplotlib scipy

我有一个简单的问题,但没有找到答案..

让我们来看看这段代码:

from matplotlib import pyplot
import numpy

x=[0,1,2,3,4]
y=[5,3,40,20,1]
pyplot.plot(x,y)

绘制并绘制所有点。

我想说我想得到x = 1,3的y值。

如何获得与y = 30匹配的x值? (有两个)

非常感谢你的帮助

3 个答案:

答案 0 :(得分:1)

您可以使用shapely查找交叉点:

import matplotlib.pyplot as plt
import numpy as np
import shapely.geometry as SG

x=[0,1,2,3,4]
y=[5,3,40,20,1]
line = SG.LineString(list(zip(x,y)))
y0 = 30
yline = SG.LineString([(min(x), y0), (max(x), y0)])
coords = np.array(line.intersection(yline))
print(coords[:, 0])

fig, ax = plt.subplots()
ax.axhline(y=y0, color='k', linestyle='--')
ax.plot(x, y, 'b-')
ax.scatter(coords[:, 0], coords[:, 1], s=50, c='red')
plt.show()

x找到解决方案:

[ 1.72972973  2.5       ]

enter image description here

答案 1 :(得分:0)

以下代码可能会执行您想要的操作。 y(x)的插值是直接的,因为x值是单调递增的。一旦函数没有像这种情况那样单调递增,找到给定y的x值的问题就不那么容易了。因此,您仍需要大致了解值的预期位置。

import numpy as np
import scipy.interpolate
import scipy.optimize

x=np.array([0,1,2,3,4])
y=np.array([5,3,40,20,1])

#if the independent variable is monotonically increasing
print np.interp(1.3, x, y)

# if not, as in the case of finding x(y) here,
# we need to find the zeros of an interpolating function
y0 = 30.
initial_guess = 1.5 #for the first zero, 
#initial_guess = 3.0 # for the secon zero
f = scipy.interpolate.interp1d(x,y,kind="linear")
fmin = lambda x: np.abs(f(x)-y0)
s = scipy.optimize.fmin(fmin, initial_guess, disp=False)
print s

答案 2 :(得分:0)

我使用python 3。

print(numpy.interp(1.3, x, y))

Y = 30
eps = 1e-6
j = 0
for i, ((x0, x1), (y0, y1)) in enumerate(zip(zip(x[:-1], x[1:]), zip(y[:-1], y[1:]))):
    dy = y1 - y0
    if abs(dy) < eps:
        if y0 == Y:
            print('There are infinite number of solutions')
    else:
        t = (Y - y0)/dy
        if 0 < t < 1:
            sol = x0 + (x1 - x0)*t
            print('solution #{}: {}'.format(j, sol))
            j += 1