我正在尝试使用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,以便平滑它们。
答案 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
位置! (不是很好,但使用零和,不对称和混合签名内核,你不能正确地进行卷积)。
但是,在使用scipy时,您需要反转(因此[::-1]
)内核。
在你的情况下,你也可以简单地使用numpy.diff
(它会降低前导零):
>>> np.diff(var1)
array([1, 1, 1, 1, 1, 1, 1, 1, 1])