【问题标题】:Python: is it possible to interpolate a matrix in a MATLAB style?Python:是否可以在 MATLAB 样式中插入矩阵?
【发布时间】:2016-03-04 22:03:48
【问题描述】:

我很难在 python 中插入矩阵/数据框。

假设我们有一个矩阵M = 3x4x = [1 3 5]y = [0.1 0.4 0.5 0.7]

这是我在 Matlab 中进行插值然后绘图的方法。

xq = 1:1:5;
yq = 0.1:0.1:1;
[xq,yq] = meshgrid(xq,yq);
zq = interp2(y,x,M,xq,yq);
figure
h=pcolor(xq,yq,zq)
set(h,'EdgeColor','none')

这在 Python 中是一种可能的方式

from scipy import interpolate
import numpy as np

def my_interp(X, Y, Z, x, y, spn=3):
    xs,ys = map(np.array,(x,y))
    z = np.zeros(xs.shape)
    for i,(x,y) in enumerate(zip(xs,ys)):
        # get the indices of the nearest x,y
        xi = np.argmin(np.abs(X[0,:]-x))
        yi = np.argmin(np.abs(Y[:,0]-y))
        xlo = max(xi-spn, 0)
        ylo = max(yi-spn, 0)
        xhi = min(xi+spn, X[0,:].size)
        yhi = min(yi+spn, Y[:,0].size)
        # make slices of X,Y,Z that are only a few items wide
        nX = X[xlo:xhi, ylo:yhi]
        nY = Y[xlo:xhi, ylo:yhi]
        nZ = Z[xlo:xhi, ylo:yhi]
        intp = interpolate.interp2d(nX, nY, nZ)
        z[i] = intp(x,y)[0]
    return z

zq = my_interp(y, x, M, xq, yq)

【问题讨论】:

  • 一些明目张胆的自我推销:interpolation (look for griddata)pcolor(mesh)。必要的功能有据可查。
  • 您可以为那些不熟悉 MATLAB 功能的 Python 人员描述过程和结果。
  • 谢谢大家...:) 我会分享我的 Python 代码!
  • @Prune 实际上,添加 np. sp.interpolate.plt. 将使这与 numpy 几乎是 1:1。如np.meshgridsp.interpolate.griddataplt.pcolor。即使sp.interpolate.interp2d 也可以,但最好避免它。否则,我完全支持你的想法,需要更多信息才能更清楚地了解。
  • @Andras -- 我非常同意;这就是为什么我没有投票或投票结束。 很清楚,但原始帖子排除了一些潜在的贡献。

标签: python image matlab matrix interpolation


【解决方案1】:

正如我在评论中指出的,您的代码可以使用必要的库 1:1 转换为 python。对于linspace/meshgrid,您需要numpy,对于pcolor(mesh),您需要matplotlib.pyplot,对于griddata,您需要scipy.interpolate。我本来想说“interp2d is available but don't use it,但事实证明你需要在输入数据的凸包之外进行外推,所以griddata 不会削减它。这是interp2d 的解决方案,但将结果与一粒盐:

import numpy as np
import scipy.interpolate as interp
import matplotlib.pyplot as plt

# input
xv = np.array([1, 3, 5])
yv = np.array([0.1, 0.4, 0.5, 0.7])
x,y = np.meshgrid(xv,yv)
M = np.random.rand(4,3)

xqv = np.arange(1,6)
yqv = np.arange(0.1,1.1,0.1)
xq,yq = np.meshgrid(xqv,yqv)
zqfun = interp.interp2d(x,y,M)
zq = zqfun(xqv,yqv)

plt.figure()
#h = plt.pcolor(xq,yq,zq)
h = plt.pcolormesh(xq,yq,zq)   # <-- same thing but faster

结果(左)与您的 MATLAB 原件相比(右;在interp2d 中修复了x,y,M 的顺序后):

你可以看到两边的结果不同,这是因为 MATLAB 总是丢弃数据的最后一行和最后一列,而 matplotlib 不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多