【问题标题】:Applying np.where in a sliding window在滑动窗口中应用 np.where
【发布时间】:2021-12-11 05:47:36
【问题描述】:

我有一个 True/False 值数组,我想将其用作另一个不同形状数组的重复掩码。

import numpy as np

mask = np.array([[ True, True],
                 [False, True]])

array = np.random.randint(10, size=(64, 64))

我想在滑动窗口中应用这个掩码,类似于数组上的where 函数。目前,我使用np.kron 来简单地重复掩码以匹配数组的尺寸:

layout = np.ones((array.shape[0]//mask.shape[0], array.shape[1]//mask.shape[1]), dtype=bool)
mask = np.kron(layout, mask)
result = np.where(mask, array, 255) # example usage

是否有任何优雅的方式来执行相同的操作,而无需将mask 重复为与array 相同的形状?我希望会有某种滑动窗口技术或卷积/相关。

【问题讨论】:

    标签: python numpy sliding-window


    【解决方案1】:

    你可以试试np.tile:

    np.where(np.tile(mask, (a//m for a,m in zip(array.shape, mask.shape))), array, 255)
    

    【讨论】:

    • 这似乎与我使用 np.kron 的解决方案相同,但效率更高,不完全是我想要的,但仍然很高兴知道。
    【解决方案2】:

    使用带有 reshape 的广播,这样您就不需要额外的内存来存储重复的mask

    x, y = array.shape[0]// mask.shape[0], array.shape[1] // mask.shape[1]
    
    result1 = np.where(mask[None, :, None], 
                      array.reshape(x, mask.shape[0], y, mask.shape[1]), 
                      255).reshape(array.shape)
    

    【讨论】:

    • 哇,我不知道它是如何工作的,但它似乎符合我的要求。我想我需要更多地了解形状。谢谢你:)
    猜你喜欢
    • 2016-12-28
    • 2014-09-09
    • 2012-03-04
    • 2012-03-05
    • 2012-08-08
    • 2012-10-20
    • 1970-01-01
    • 2016-03-06
    • 2013-04-03
    相关资源
    最近更新 更多