【问题标题】:Upsample and Interpolate a NumPy Array对 NumPy 数组进行上采样和插值
【发布时间】:2017-06-12 06:10:38
【问题描述】:

我有一个数组,类似于:

array = np.arange(0,4,1).reshape(2,2)

> [[0 1
    2 3]]

我想对这个数组进行上采样以及对结果值进行插值。我知道对数组进行上采样的一个好方法是使用:

array = eratemp[0].repeat(2, axis = 0).repeat(2, axis = 1)
[[0 0 1 1]
 [0 0 1 1]
 [2 2 3 3]
 [2 2 3 3]]

但我无法找到一种方法来插入值以消除数组的每个 2x2 部分之间的“块状”性质。

我想要这样的东西:

[[0 0.4 1 1.1]
 [1 0.8 1 2.1]
 [2 2.3 3 3.1]
 [2.1 2.3 3.1 3.2]]

类似这样的东西(注意:这些不是确切的数字)。我知道可能无法对这个特定的 2D 网格进行插值,但是在我的回答中使用第一个网格,在上采样过程中应该可以进行插值,因为您正在增加像素数,因此可以“填补空白” '。

我对插值的类型不太在意,只要最终输出是平滑的表面!我曾尝试使用 scipy.interp2d 方法,但无济于事,如果有人能分享他们的智慧,将不胜感激!

【问题讨论】:

  • 您要进行二维插值吗?我不明白这将如何工作。当你插入一个轴时,你会破坏另一个轴的插值。对吗?
  • “你明白了!” ——对不起,我不太明白。您能填写您期望的 4x4 数组的其余部分吗?
  • 谢谢你们。我已经填写了网格的其余部分,以了解我想要的结果。我知道在我的答案中插入第二个 2D 网格可能有问题,但是在上采样过程发生时必须有一种方法来插入第一个网格?

标签: python arrays numpy scipy interpolation


【解决方案1】:

您可以使用 SciPy interp2d 进行插值,您可以找到文档 here

我对文档中的示例进行了一些修改:

from scipy import interpolate
x = np.array(range(2))
y = np.array(range(2))
a = np.array([[0, 1], [2, 3]])
xx, yy = np.meshgrid(x, y)
f = interpolate.interp2d(x, y, a, kind='linear')

xnew = np.linspace(0, 2, 4)
ynew = np.linspace(0, 2, 4)
znew = f(xnew, ynew)

如果你打印znew,它应该是这样的:

array([[ 0.        ,  0.66666667,  1.        ,  1.        ],
       [ 1.33333333,  2.        ,  2.33333333,  2.33333333],
       [ 2.        ,  2.66666667,  3.        ,  3.        ],
       [ 2.        ,  2.66666667,  3.        ,  3.        ]])

【讨论】:

  • +1 谢谢!充分利用现有函数一次性完成我的上采样和插值步骤!
【解决方案2】:

我会使用scipy.misc.imresize:

array = np.arange(0,4,1).reshape(2,2)
from skimage.transform import resize
out = scipy.misc.imresize(array, 2.0)

2.0 表示我希望输出是输入尺寸的两倍。您也可以提供 inttuple 来指定原始尺寸的百分比或仅指定新尺寸本身。

这很容易使用,但有一个额外的步骤,因为imresize 重新调整所有内容,使最大值变为 255,最小值变为 0。(并将数据类型更改为 np.unit8。)您可能需要做类似的事情:

out = out.astype(array.dtype) / 255 * (np.max(array) - np.min(array)) + np.min(array)

让我们看看输出

>>> out.round(2)
array([[0.  , 0.25, 0.75, 1.  ],
       [0.51, 0.75, 1.26, 1.51],
       [1.51, 1.75, 2.26, 2.51],
       [2.  , 2.25, 2.75, 3.  ]])

imresize 带有弃用警告和替代警告:

弃用警告:imresize 已弃用! imresize 已弃用 在 SciPy 1.0.0 中,将在 1.2.0 中删除。采用 skimage.transform.resize 代替。

【讨论】:

    【解决方案3】:

    SciPy 中的表单重采样方法。表示您可以在一个轴上依次对二维数组进行上采样,然后在另一个轴上进行上采样。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2012-03-10
    • 2013-12-17
    • 2012-06-06
    • 2020-05-22
    • 2019-04-17
    • 2022-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    相关资源
    最近更新 更多