从轮廓返回 z 值时出现 ValueError

ValueError when returning z-value from contour

我正在尝试 return 轮廓的 z-value。具体点我要用到return中z-value是从['C1_X'],['C1_Y']中调用df。该代码在这些坐标按升序排列时有效,但在按降序排列时会抛出错误。

错误:

raise ValueError("Error code returned by bispev: %s" % ier)
ValueError: Error code returned by bispev: 10

用于 return z 值的代码是:

    # Return z-value for C coordinate
    f = RectBivariateSpline(X[0, :], Y[:, 0], normPDF.T)
    z = f(d['C1_X'], d['C1_Y']) 
    print(z)

错误代码 10 表示输入无效(Google 搜索!)。

创建玩具数据。您的代码做了很多事情,我想隔离导致错误的部分。

X,Y = np.meshgrid(np.linspace(0, 20), np.linspace(0, 20))

创建一个可调用对象以在输入处插入值。

from scipy.interpolate import RectBivariateSpline
f = RectBivariateSpline(X[0, :], Y[:, 0], z = X**2+Y**2)

尝试运行代码。

f([10,10,10,10,10,10,10,10,10,10], [10,10,10,10,10,10,10,10,10,9])

T运行分类输出

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-84-73aaa29ad73f> in <module>
----> 1 f([10,10,10,10,10,10,10,10,10,10], [10,10,10,10,10,10,10,10,10,9])

检查 f 的文档字符串,看看那里是否有一些信息。我正在 Jupyter 笔记本中执行此操作。

f?

T运行分类输出

Signature:      f(x, y, dx=0, dy=0, grid=True)
Type:           RectBivariateSpline
String form:    <scipy.interpolate.fitpack2.RectBivariateSpline object at 0x7f5a4a7f9cc0>
File:           ~/bin/anaconda3/envs/py37a/lib/python3.7/site-packages/scipy/interpolate/fitpack2.py
Docstring:     
Bivariate spline approximation over a rectangular mesh.

Can be used for both smoothing and interpolating data.

Parameters
----------
x,y : array_like
    1-D arrays of coordinates in strictly ascending order.
...
...
...

哦。它希望点也按 严格升序 进行评估。那么排序要评估的点是否有效?

f([10,10,10,10,10,10,10,10,10,10], [9, 10,10,10,10,10,10,10,10,10])

输出

array([[181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.],
       [181., 200., 200., 200., 200., 200., 200., 200., 200., 200.]])

在您的代码中调用插值函数之前对要执行插值的点进行排序是否可行?

希望对您有所帮助。


编辑

我的意思是:

f = RectBivariateSpline(X[0, :], Y[:, 0], normPDF.T)
# z = f(d['C1_X'], d['C1_Y'])
x_ip = d['C1_X']
y_ip = d['C1_Y']
z = np.empty((len(x_ip), len(y_ip)), dtype=np.float64)
for i, x in enumerate(x_ip):
    z[i, :] = f([x], y_ip) # ASSUME THAT y_ip IS SORTED.
print(z)

我通过此更改在我的机器上 运行ning 获得了您的代码:它显示了一些轮廓动画。将此想法应用于 x 和 y 不能同时按升序排列的其他情况。您可以遍历 x 和 y,但这会增加函数调用的次数。