如果2 * 2像素中的任何元素包含1,则如何将4 X 6
大小的栅格数据缩减为2 X 3
大小强制执行'1',否则为0?
import numpy as np
data=np.array([
[0,0,1,1,0,0],
[1,0,0,1,0,0],
[1,0,1,0,0,0],
[1,1,0,0,0,0]])
结果应为:
result = np.array([
[1,1,0],
[1,1,0]])
答案 0 :(得分:2)
import numpy as np
def toblocks(arr, nrows, ncols):
h, w = arr.shape
blocks = (arr.reshape(h // nrows, nrows, -1, ncols)
.swapaxes(1, 2)
.reshape(h // nrows, w // ncols, ncols * nrows))
return blocks
data = np.array([[0, 0, 1, 1, 0, 0],
[1, 0, 0, 1, 0, 0],
[1, 0, 1, 0, 0, 0],
[1, 1, 0, 0, 0, 0]])
blocks = toblocks(data, 2, 2)
downscaled = blocks.any(axis=-1).astype(blocks.dtype)
print(downscaled)
# [[1 1 0]
# [1 1 0]]
上述解决方案的来源:前一段时间,an SO question询问如何将数组分成块。我所做的只是略微修改了将any
应用于每个块的解决方案。
答案 1 :(得分:2)
你可以使用scikit的补丁提取程序学习如下(你应该能够复制和粘贴):
from sklearn.feature_extraction.image import extract_patches
data = np.array([[0, 0, 1, 1, 0, 0],
[1, 0, 0, 1, 0, 0],
[1, 0, 1, 0, 0, 0],
[1, 1, 0, 0, 0, 0]])
patches = extract_patches(data, patch_shape=(2, 2), extraction_step=(2, 2))
non_zero_count_patches = (patches > 0).any(axis=-1).any(axis=-1).astype(int)
print non_zero_count_patches
解释:函数extract_patches
在您的数组上生成一个视图,该视图代表大小为patch_shape
和离散化步骤extraction_step
的滑动补丁,您可以更改如你所愿。以下行检查哪些修补程序包含非零项目。但是,这可以替换为您可能感兴趣的任何其他内容,例如平均值,总和等。优点是您可以自由选择补丁大小和提取步骤(它们不需要对应),直到没有内存开销调用any
(它在内部使用步幅)。