astropy.convolution.convolve returns 纳米值

astropy.convolution.convolve returns nan values

我正在尝试使用 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)

我的 return 是:array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])

我假设它应该 return array([0,1,1,1,1,1,1,1,1,1])。我已经尝试使用 var1 数据类型 uint8、int8 和 float32。我也试过使用 convolve_fft,结果相同。

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

您的内核总和为零,因此,astropy 将发出警告

RuntimeWarning: invalid value encountered in true_divide kernel_internal /= kernel_sum

最终导致所有 nans

正如已经指出的那样,这是因为您的内核总和为零:

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

如果不规范化 kernelastropy.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])