我知道有scipy.signal.convolve2d函数可以处理2d numpy数组的二维卷积,还有numpy.ma模块可以处理丢失的数据,但这两种方法似乎并不兼容(这意味着即使你在numpy中屏蔽了一个二维数组,convolve2d中的进程不会受到影响)。有没有办法只使用numpy和scipy包来处理卷积中缺少的值?
例如:
所需的卷积结果(数组、内核、边界='wrap'):
-1 - -1 -1 4
-1 -1 - -1 4
Result = -1 -1 -1 - 5
- -1 -1 4 4
1 -1 -1 -1 -
感谢Aguy的建议,这是一个很好的方法来帮助计算卷积后的结果。现在让我们假设我们可以从Array.mask中得到Array的掩码,这将给予的结果为
False True False False False
False False True False False
Array.mask == False False False True False
True False False False False
False False False False True
如何使用此掩码将卷积后的结果转换为掩码数组?
3条答案
按热度按时间kxxlusnw1#
我不认为用0来代替是正确的方法,你是在把卷积值推向0。这些缺失应该被视为“缺失”。因为它们代表了缺失的信息片段,没有理由假设它们可能是0,而且它们根本不应该参与任何计算。
我试着将缺失值设置为
numpy.nan
,然后进行卷积,结果表明,内核和任何缺失值之间的任何重叠都会在结果中给出nan
,即使重叠是在内核中的0,所以在结果中会得到一个扩大的缺失孔。根据您的应用程序,这可能是您想要的结果。但是在某些情况下,您不想因为一个单一的缺失而丢弃这么多的信息(也许〈= 50%的缺失仍然是可以接受的)。在这种情况下,我发现了另一个模块 astropy,它有更好的实现:
numpy.nan
s被忽略(或替换为插值?)。因此,使用
astropy
时,您将执行以下操作:但是,您仍然无法控制允许多少丢失。为了实现这一点,我创建了一个函数,它使用
scipy.ndimage.convolve()
作为初始卷积,但每当涉及丢失(numpy.nan
)时,都要手动重新计算值:下图展示了输出结果。左边是一个30x30的随机Map,上面有3个
numpy.nan
的洞,大小为:1.一对一
右边是卷积输出,采用5x5内核(全1),容差水平为50%(
max_missing=0.5
)。因此,前2个较小的空洞使用附近的值填充,而在最后一个空洞中,因为缺失的数量〉
0.5x5x5 = 12.5
,所以放置numpy.nan
来表示缺失的信息。6gpjuf902#
我发现了一个黑客。而不是nan使用虚数(在那里是nan改变它为1i)运行卷积和设置,无论虚数值是高于一个阈值,它是nan。无论何时,它是以下只是采取真实的值。这里是一个代码片段:
5jvtdoz23#
基于the idea from Ilan Schvartzman in a previous answer的改进版本。此外,它可以补偿设置为0的缺失值(在真实的空间中),并支持归一化为np.sum(in2)。这两个值都可以分别通过参数
correct_missing
和norm
进行调整。对于一维版本,只需将scipy.signal.convolve2d
替换为scipy.signal.convolve
即可。示例
显示
correct_missing
与输入的差异的示例:与
correct_missing
的掩码卷积为:在不进行校正的情况下,如果要使用np.nan填充屏蔽值:
性能测试
我根据以下输入,对照Jason's code(
convolve2d
)测试了我的版本(masked_convolve2d
):在我的计算机上有以下结果: