【问题标题】:creating 2d mask array and applying on a 2d array创建二维掩码数组并应用于二维数组
【发布时间】:2018-02-11 19:05:44
【问题描述】:

这是我的目标
在我的解释中,我从 1 开始计算行和列。
给定一个大小为 784x49 的二维数组 - 我想处理它,以便在第 1 列 - 第 1、2、3、4、29、30、31、32、57、58、59、60、85、86、7 行, 88 个元素非零,其余元素为零。 类似地,对于第 2 列 - 第 5、6、7、8、33、34、35、36、61、62、63、64、89、90、91、92 行非零,其余行为零。 如果您假设 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 。

谢谢。

【问题讨论】:

    标签: python numpy


    【解决方案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]])
    

    【讨论】:

    • 这是在制作 n^2 个数组,每个数组有 nnk 个元素。出于我的目的,我需要 49 个数组,每个数组有 784 个元素。所以,如果 n=7 。然后 7*7*k=784 ,表示 k=16 。所以纵向是可以的。但内容方面,我希望第一个数组的 1-4,29-32,57-60,85-88 的值为 false 。在这里,我得到 1-7,50-56... 作为 false 。所以,这需要改变。
    • @user1371666 如果有错误,请不要接受 ;-) -- 好的,第二次尝试 - 请看看。
    • 那部分更好。它在 mask[0] 中产生了 112 False。 16 个在正确的地方,96 个在其他地方。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2016-12-27
    • 2017-03-22
    • 2016-12-10
    • 2013-07-16
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多