Upsample和I​​nterpolate NumPy数组

时间:2017-01-26 17:12:19

标签: python arrays numpy scipy interpolation

我有一个数组,如:

def adjacentCells(x, y):
    neighbours = [(x-1, y), (x, y-1), (x+1, y), (x, y+1)]
    return sum(
        world[b][a] if 0 <= b < len(world) and 0 <= a < len(world[b])
        else 1
        for (a,b) in neighbours)

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

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

> [[0 1
    2 3]]

但是我无法找到一种方法来插值以移除“块状”&#39;阵列的每个2x2部分之间的性质。

我想要这样的事情:

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]]

像这样的东西(注意:这些不是确切的数字)。我知道可能无法插入这个特定的2D网格,但在我的答案中使用第一个网格,在上采样过程中应该可以插值,因为你增加了像素数,因此可以填充在差距&#39;。

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

2 个答案:

答案 0 :(得分:2)

您可以使用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 :(得分:0)

我会使用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并且你的min变为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