Python:numpy.interp给出曲线

时间:2014-05-30 04:13:02

标签: python numpy interpolation

我试图将低分辨率曲线(10个数据点)线性插值到更高的分辨率(~1000个数据点)。我想要的是具有相同形状但具有更多x和y值的新曲线,即当绘制为线时,高分辨率曲线和低分辨率曲线看起来难以区分。

我多次使用Numpy的插值,所以这让我感到困惑。我按常规np.interp(newX, oldX, oldY)进行操作,但是当我绘制它时,我得到了一个有趣的结果。

Not linear interpolation

绿色方块之间的线条应该是直的,而不是像这样的拱形。

我不确定它是否重要,但我的X值范围从0到1000,我的Y值范围从1e-12到1e-16。任何建议将不胜感激!

更新:上面的图是对数对数刻度,但它也发生在线性图上。

Linear plot, same problem!

这是实际数据。 (它真的是1e-15到1e-19):

X = array([  0.3543  ,   0.477   ,   0.544579,   0.6231  ,   0.64142 ,
         0.7625  ,   0.79788 ,   0.9134  ,   1.02894 ,   1.235   ,
         1.241608,   1.615118,   1.662   ,   2.159   ,   2.181858,
         3.4     ,   3.507511,   3.732206,   4.436578,   4.6     ,
         4.664426,   5.628102,   7.589159,  12.      ])

Y = array([  8.54633502e-19,   3.82388943e-18,   7.33750003e-18,
         2.98683733e-17,   7.77237551e-17,   2.04059657e-16,
         3.72124584e-16,   8.77407275e-16,   1.65824812e-15,
         2.48616026e-15,   2.80165491e-15,   2.03270375e-15,
         2.03205199e-15,   1.24592352e-15,   1.20231667e-15,
         3.85565084e-16,   4.34827044e-16,   3.86967563e-16,
         1.67622220e-16,   1.48774069e-16,   1.25065750e-16,
         7.53511540e-17,   2.34138998e-17,   5.77852724e-18])

所以我确信它确实只是一个对数尺度效应。但是出于某些原因,当我使用ax.loglog()进行绘制然后执行ax.set_yscale('linear')时,轴刻度会发生变化,但子绘图数据不会变化。当我使用ax.plot()绘制它时,它看起来很好。

任何人都能解释一下吗?

2 个答案:

答案 0 :(得分:2)

翻译自http://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1000,10)
y = np.random.uniform(1e-16, 1e-12, 10)
xvals = np.linspace(0, 1000, 100)
yinterp = np.interp(xvals, x, y)

plt.plot(x, y, c='k')
plt.plot(xvals, yinterp, 'o', c='w')
plt.show()

enter image description here

答案 1 :(得分:2)

我也有同样的问题,但是有scipy的interpolate.interp1d。问题不在于代码,而在于对数的工作原理。线性图上的直线在半对数图上变为曲线。考虑一下极限情况,你只想在半月图和连接上绘制两个点(ya,xa)(yb,xb)。如果您首先在这些点之间进行线性插值,则创建一个对象,该对象是一个线段 L(x)(例如,由一个精细网格点数组表示)。然后,如果您记录 L 的日志并将其与 x 进行对比,那么您将获得一条曲线。这就是" bouncy"附加情节上的行为。如果你想在日志图中有一条直线,你需要记录 ya yb ,插值,然后绘图。如果您正在查看跨越数十年的内容,您可能希望在获取日志后进行插值,但这可能取决于您的应用程序。