将一个numpy数组升级并均匀分配值

3
我有一个表示空间数据的二维numpy数组。我需要增加它的分辨率,并且需要在整个空间均匀分布数值。例如,一个值为5的元素将变成:
1.25 1.25 1.25 1.25
我查看了imresize,但我认为插值选项对此无效。也许有其他方法?如果可能的话,我想避免迭代行和列。非常感谢您的帮助!谢谢!
1个回答

4

只需将其高度和宽度定义的块中元素的数量相除,然后复制/扩展即可。要进行复制,我们可以使用np.repeatnp.lib.stride_tricks.as_strided

使用np.repeat -

def upscale_repeat(a, h, w):
    return (a/float(h*w)).repeat(h, axis=0).repeat(h, axis=1)

使用np.lib.stride_tricks.as_stridedtile_array数组函数,可以实现更高效的索引操作。

def upscale_strided(a, h, w):
    return tile_array(a/float(h*w), h, w)

示例运行 -

In [140]: a
Out[140]: 
array([[ 7,  6,  9],
       [ 6,  6, 10]])

In [141]: upscale_repeat(a, 2, 2)
Out[141]: 
array([[ 1.75,  1.75,  1.5 ,  1.5 ,  2.25,  2.25],
       [ 1.75,  1.75,  1.5 ,  1.5 ,  2.25,  2.25],
       [ 1.5 ,  1.5 ,  1.5 ,  1.5 ,  2.5 ,  2.5 ],
       [ 1.5 ,  1.5 ,  1.5 ,  1.5 ,  2.5 ,  2.5 ]])

In [142]: upscale_repeat(a, 2, 3)
Out[142]: 
array([[ 1.17,  1.17,  1.17,  1.  ,  1.  ,  1.  ,  1.5 ,  1.5 ,  1.5 ],
       [ 1.17,  1.17,  1.17,  1.  ,  1.  ,  1.  ,  1.5 ,  1.5 ,  1.5 ],
       [ 1.  ,  1.  ,  1.  ,  1.  ,  1.  ,  1.  ,  1.67,  1.67,  1.67],
       [ 1.  ,  1.  ,  1.  ,  1.  ,  1.  ,  1.  ,  1.67,  1.67,  1.67]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接