创建2d掩码数组并应用于2d数组

时间:2018-02-11 09:39:37

标签: python numpy

这是我的目标
在我的解释中,我从1开始计算行和列 给定一个大小为784x49的二维数组 - 我想处理它,以便在第1列 - 第1,2,3,4,29,30,31,32,57,58,59,60,85,86,7行, 88个元素不为零,其余为零。 类似于第2列 - 第5,6,7,8,3,3,3,3,3,3,6,9,6,9,6,9,6,9,6,9,6,9,6,9,6,9,6,9,6,9,6,9,6,9,6,9,6,9,6,9,9,5,9和9,5是非零的,其余为零。 如果您假设784为28x28图像,那么您可以理解我的49列中的每一列都正在访问图像的非重叠4x4区域。
我正在考虑创建一个大小为784x49的2d掩码,其中49x16(= 784)个元素设置为未屏蔽而其他掩码被屏蔽。所以,我可以在784x49输入数组上重复使用此掩码,以便在2d数组中快速设置零。登记/> 我的伪代码是

first time = 0;
for x in range(0,49) :
    initialize a 2D array 'one_column_at_a_time' of 28x28 inputs with all element set to TRUE ;
    one_column_at_a_time[x/7:(x/7)+4,(x%7)*4:(x%7)*4+4]=FALSE ;
    reshape one_column_at_a_time to 784x1;
    if (first time == 0):
        first time = 1 ;
        full_784x49 = one_column_at_a_time;
    else
        full_784x49 = vertical_stack(full_784x49,one_column_at_a_time);

我无法找出专门用于创建蒙版2d numpy数组的相关函数。我知道np.vstack,np.reshape,np.zeros,np.ones。

感谢。

1 个答案:

答案 0 :(得分:1)

这大致是你想要的吗?

>>> import numpy as np
>>> n = 3 # use 7
>>> k = 2 # use 4
>>> mask = (np.clip(np.add.outer(-np.arange(n*n), np.arange(n*n*k*k) // k), -1, k*n + 1) % n).astype(bool) 
>>> mask
array([[False, False,  True,  True,  True,  True, False, False,  True,
         True,  True,  True, False, False,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True,  True, False, False,  True,  True,  True,  True, False,
        False,  True,  True,  True,  True, False, False,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True, False, False,  True,  True,  True,
         True, False, False,  True,  True,  True,  True, False, False,
         True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True, False, False,  True,
         True,  True,  True, False, False,  True,  True,  True,  True,
        False, False,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True, False,
        False,  True,  True,  True,  True, False, False,  True,  True,
         True,  True, False, False,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True, False, False,  True,  True,  True,  True, False, False,
         True,  True,  True,  True, False, False,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True, False, False,  True,  True,  True,  True,
        False, False,  True,  True,  True,  True, False, False,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True, False, False,  True,  True,
         True,  True, False, False,  True,  True,  True,  True, False,
        False,  True,  True,  True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True, False, False,
         True,  True,  True,  True, False, False,  True,  True,  True,
         True, False, False,  True,  True,  True,  True,  True,  True]])