更改numpy数组的结构强制给定值

时间:2014-05-05 12:23:29

标签: python numpy scipy

如果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]])

2 个答案:

答案 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(它在内部使用步幅)。