astropy.convolution.convolve返回nan值

时间:2015-07-01 08:01:54

标签: python numpy convolution astropy

我正在尝试使用astropy模块来平滑我的数据。作为一维示例,我尝试了以下代码:

import numpy as np
from astropy import convolution as conv
var1=np.arange(10)
kernel=np.asarray([-1,1,0])
conv.convolve(var1,kernel)

这会在我的案例中返回:array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])

我认为它应该返回array([0,1,1,1,1,1,1,1,1,1])。我尝试过使用var1数据类型uint8,int8和float32。我也尝试使用convolve_fft,结果相同。

我熟悉scipy的卷积滤波器,但我想在我的数据中实际存在NaN值时使用astropy,以便平滑它们。

2 个答案:

答案 0 :(得分:3)

你的内核总和为零,因此astropy会引发警告

RuntimeWarning: invalid value encountered in true_divide kernel_internal /= kernel_sum

最终导致所有nans

答案 1 :(得分:0)

正如已经指出的那样,因为你的内核之和为零:

>>> import numpy as np
>>> np.sum(kernel)  # kernel = np.asarray([-1,1,0])
0

如果不对kernel进行规范化,那么本身就不会有问题,但astropy.convolution.convolve总是将内核规范化为内插NaN(因为astropy 1.3也被屏蔽)值数组并将结果再次乘以原始内核的总和(除非您明确使用normalize_kernel=True)。

即使你已经说过你熟悉它,你仍然可以使用scipy.ndimage.convolve

>>> from scipy.ndimage import convolve

>>> convolve(var1, kernel[::-1])  # var1=np.arange(10)
array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1])

自己进行插值和卷积以及NaN位置! (不是很好,但使用零和,不对称和混合签名内核,你不能正确地进行卷积)。

但是,在使用时,您需要反转(因此[::-1])内核。

在你的情况下,你也可以简单地使用numpy.diff(它会降低前导零):

>>> np.diff(var1)
array([1, 1, 1, 1, 1, 1, 1, 1, 1])