我有一个2D数组,我想将其下采样以将其与另一个进行比较。
让我们说我的数组x
是512x512
,我想要一个数组y
128x128
,其中y
的元素是使用插值生成的价值超过4x4
的{{1}}块(此插值可能只取平均值,但其他方法,如几何平均值,可能会很有趣)
到目前为止,我看了x
,但我没有得到我想要的结果
scipy.ndimage.interpolation.zoom
我希望>> x = np.arange(16).reshape(4,4)
>> print(x)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
>> y = scipy.ndimage.interpolation.zoom(x, 0.5)
>> print(y)
[[ 0 3]
[12 15]]
是
y
请注意,仅设置[[ 2.5 4.5]
[10.5 12.5]]
并不能解决问题......
答案 0 :(得分:1)
sklearn.feature_extraction.image.extract_patches
巧妙地使用np.lib.stride_tricks.as_strided
来制作可以操作的窗口数组。
sliding_window
功能,可在此处找到
Efficient Overlapping Windows with Numpy生成一个带或不带重叠的窗口数组
还有,让我们一睹幕后发生的事情。
>>> a = np.arange(16).reshape(4,4)
step_height,step_width
确定窗口的重叠 - 在您的情况下,步骤与窗口大小相同,没有重叠。
>>> window_height, window_width, step_height, step_width = 2, 2, 2, 2
>>> y = sliding_window(a, (window_height, window_width), (step_height,step_width))
>>> y
array([[[ 0, 1],
[ 4, 5]],
[[ 2, 3],
[ 6, 7]],
[[ 8, 9],
[12, 13]],
[[10, 11],
[14, 15]]])
在Windows上操作:
>>> y = y.mean(axis = (1,2))
>>> y
array([ 2.5, 4.5, 10.5, 12.5])
您需要根据窗口数确定最终形状。
>>> final_shape = (2,2)
>>> y = y.reshape(final_shape)
>>> y
array([[ 2.5, 4.5],
[ 10.5, 12.5]])
搜索SO numpy
,窗口,数组应该产生许多其他答案和可能的解决方案。
答案 1 :(得分:0)
你似乎要寻找的是4块的平均值,zoom
无法获得,因为zoom
使用插值(参见其文档字符串)
要获得您展示的内容,请尝试以下
import numpy as np
x = np.arange(16).reshape(4, 4)
xx = x.reshape(len(x) // 2, 2, x.shape[1] // 2, 2).transpose(0, 2, 1, 3).reshape(len(x) // 2, x.shape[1] // 2, -1).mean(-1)
print xx
这会产生
[[ 2.5 4.5]
[ 10.5 12.5]]
或者,可以使用sklearn.feature_extraction.image.extract_patches
from sklearn.feature_extraction.image import extract_patches
patches = extract_patches(x, patch_shape=(2, 2), extraction_step=(2, 2))
xx = patches.mean(-1).mean(-1)
print xx
但是,如果你的目标是以优雅的方式对图像进行二次采样,那么采用图像的均值 是正确的方法:它可能会导致锯齿效果。在这种情况下,您应该做的是使用scipy.ndimage.gaussian_filter
(例如sigma=0.35 * subsample_factor
)稍微平滑图像,然后通过索引[::2, ::2]